OpenShift Redis Cartridge
rhc add-cartridge http://cartreflect-claytondev.rhcloud.com/reflect?github=smarterclayton/openshift-redis-cart
Any log output will be generated to $OPENSHIFT_REDIS_DIR/logs/redis.log
Supports clustering and persistence, with monitoring from Redis Sentinel. Does not automatically pull the latest security updates - please monitor the Redis upstream 2.6 branches.
How it Works
conf/redis.conf.erb is run before Redis starts and generates a configuration file. It will attempt to load the file
.openshift/redis.conf if it exists. The default configuration will snapshot the db to disk into the
At cart creation, a unique password will be generated to the environment variable
REDIS_PASSWORD - the server will require this to connect.
redis-cli from the SSH session, use the $REDIS_CLI environment variable to get the correct config on the gear
$ ssh <gear with redis> Connectiing to.... $ redis-cli $REDIS_CLI 127.0.32.124 6379>
To connect to Redis from your local shell, run the
cartridge-status command to get the port and authorization info:
$ rhc cartridge-status redis -a <yourapp> RESULT: Redis is running master (receives writes), mode sharded Connect to: 343928-abc.dev.rhcloud.com:35546 password: 80o9euk80oeu90834
and then run
rhc port-forward to your app:
$ rhc port-forward <yourapp> .... redis 127.0.0.1:35546 => 343928-abc.dev.rhcloud.com:35546
In another shell window, run
$ redis-cli -p 35546 -a 80o9euk80oeu90834 redis 127.0.0.1:35546>
A number of Redis configuration values can be tuned via environment variables:
The password for accessing Redis.
The maximum memory this instance will allow. No default value.
The value of
appendonlyin redis.conf. Defaults to 'no'
The value of
appendfsyncin redis.conf. Defaults to 'everysec'
Always restart each gear after setting these environment variables.
If you install this cartridge from source, you will be using a precompiled version of Redis 2.6 for RHEL6. You can run the
bin/control update script on each gear to build and update to the latest version of the Redis 2.6 tree.
$ rhc ssh <yourapp> --gears 'cd redis && ./bin/control update' $ rhc restart-cartridge redis -a <yourapp>'
We hope to add a more natural update process at a later point.
The Redis cartridge supports two modes:
Sharded, with no slaves
Each scaled gear you add is a new master - you can talk to each, but there is no slave configuration created. Clients are responsible for determining which client to talk to.
Read replicas, one master
Each scaled gear you add after the first becomes a slave in read only mode - changes you make to the master are automatically propagated.
At this time, when you scale up Redis the master host and port are not automatically communicated to your web gears - you'll need to set your own environment variables on each gear or in your client code. In the future, we'll support exposing an environment variable that contains the hosts and ports of each member of the cluster.
Setting the mode requires an environment variable to set on each gear. Until application wide environment variables are supported, you must set the variable on each Redis gear, then send the scale-cartridge command to instruct Redis to recalculate its internal mode.
# determine the size of your cluster $ rhc scale-cartridge redis -a <yourapp> 2 # environment variables are not copied on scale up today $ rhc ssh <yourapp> --gears 'cd redis && echo read_replica > env/REDIS_DB_MODE' # recalculate the mode $ rhc scale-cartridge redis -a <yourapp> 2 # have the mode take effect $ rhc restart-cartridge redis -a <yourapp>
Scaling the cartridge recalculates the configuration, and then restart makes the configuration change take effect. Run
rhc cartridge-status to see the outcome of your change:
$ rhc cartridge-status redis -a foo RESULT: Redis is running slave Connect to: gear1-abc.dev.rhcloud.com:35541 password: a_pass Redis is running master (receives writes), mode read_replica Connect to: gear1-abc.dev.rhcloud.com:35546 password: a_pass
Note that in scaled apps, port forward may not correctly represent the correct master. You may need to port forward directly to the scaled gears via
Redis Sentinel can be configured to run with the Redis cartridge and provide master failover and monitoring in the 'read_replica' cluster mode. Each gear will run one instance of Sentinel, and if the master is detected to be down one of the slave gears will be elected to be the new master. Your clients must be aware of the possibility of failover.
To enable Sentinel support, set the
REDIS_SENTINEL environment variable in each gear to
$ rhc ssh <yourapp> --gears 'cd redis && echo 1 > env/REDIS_SENTINEL' $ rhc restart-cartridge redis -a <yourapp>
rhc cartridge-status to get the connection information for Sentinel.
By default, the quorum is
# of gears / 2 + 1. If you want to run two gears, set the environment variable
1 on each gear to instruct Sentinel to perform failover to the slave.
- Get support for environment variable export from a connection hook (to publish to the web gears)
- Investigate running in plugin mode and in scaled cluster mode
- Add additional slave modes.