Операция и обслуживание Linux - Создание высокодоступных кеш Redis Cache

Java Redis Linux

предисловие

Redisэто высокая производительностьkey-valueБаза данных, теперь все больше и больше предприятий и приложений используютRedisкак кеш-сервер. ВладелецJAVABack-end программисты также наполовину инженеры по эксплуатации и обслуживанию. существуетLinuxсборка на сервереRedis, как же не быть? Следующий домовладелец возьмет всех, чтобы начать с 0 и построить их по очереди:RedisАвтономный сервер ->RedisМастер-ведомая репликация ->Redis-Sentinel高可用. Шаг за шагом создайте сервер кэша Redis с высокой доступностью. Основные справочные статьи: короткая книга:Создайте систему высокой доступности Redis

Арендодатель относится к строительству шаг за шагом на основе этой статьи, поэтому содержание относительно похоже, спасибо автору оригинального текста и настоящим заявляю.

Эта статья одновременно опубликована в Цзяньшу: http://www.jianshu.com/p/d7bc873b8797.

Построить Redis

1. Скачайте и разархивируйте

Первый изRedisЗагрузка с официального сайтаRedisИ распаковать, версия используемая арендодателем 4.0.2. Выполните последовательно следующие команды:

cd /usr/local/
wget http://download.redis.io/releases/redis-4.0.2.tar.gz
tar -zxvf redis-4.0.2.tar.gz

Если не установленgccПакет зависимостей, установите соответствующий пакет зависимостей

yum install -y gcc-c++ tcl

2. Скомпилируйте и установите

После загрузки и распаковки скомпилируйте и установите исходный пакет.RedisПуть установки/usr/local/redis, учащиеся могут изменить предложение самостоятельно:make install PREFIX=你想要安装的路径

cd /usr/local/redis-4.0.2/
make install PREFIX=/usr/local/redis

копироватьRedisсоответствующие команды для/usr/sbinкаталог, поэтому вы можете выполнять эти команды напрямую, не указывая полный путь

cd /usr/local/redis/bin/
sudo cp redis-cli  redis-server  redis-sentinel   /usr/sbin/

3. Создайте файл конфигурации Redis

После завершения установкиRedisСкопируйте файл конфигурации в каталог конфигурации системы/etc/Вниз,redis.confдаRedisфайл конфигурации,redis.confсуществуетRedisисходный каталог,portПо умолчанию 6379.

cp /usr/local/redis-4.0.2/redis.conf  /etc/

RedisСправочник по анализу основных параметров файла конфигурации

daemonize  no               #redis进程是否以守护进程的方式运行,yes为是,no为否(不以守护进程的方式运行会占用一个终端)
pidfile /var/run/redis.pid  #指定redis进程的PID文件存放位置
port 6379                   #redis进程的端口号
bind 127.0.0.1              #绑定的主机地址
timeout  300                #客户端闲置多长时间后关闭连接,默认此参数为0即关闭此功能
loglevel verbose            #redis日志级别,可用的级别有debug.verbose.notice.warning
logfile stdout              #log文件输出位置,如果进程以守护进程的方式运行,此处又将输出文件设置为stdout的话,就会将日志信息输出到/dev/null里面去了
databases 16                #设置数据库的数量,默认为0可以使用select <dbid>命令在连接上指定数据库id
save <seconds> <changes>    #指定在多少时间内刷新次数达到多少的时候会将数据同步到数据文件;
rdbcompression yes          #指定存储至本地数据库时是否压缩文件,默认为yes即启用存储;
dbfilename dump.db          #指定本地数据库文件名
dir ./                      #指定本地数据问就按存放位置;
slaveof <masterip> <masterport>     #指定当本机为slave服务时,设置master服务的IP地址及端口,在redis启动的时候他会自动跟master进行数据同步
masterauth <master-password>        #当master设置了密码保护时,slave服务连接master的密码;
requirepass footbared       #设置redis连接密码,如果配置了连接密码,客户端在连接redis是需要通过AUTH<password>命令提供密码,默认关闭
maxclients 128              #设置同一时间最大客户连接数,默认无限制;redis可以同时连接的客户端数为redis程序可以打开的最大文件描述符,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息
maxmemory<bytes>            #指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
appendonly no               #指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
appendfilename appendonly.aof       #指定跟新日志文件名默认为appendonly.aof
appendfsync everysec         #指定更新日志的条件,有三个可选参数no:表示等操作系统进行数据缓存同步到磁盘(快),always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全), everysec:表示每秒同步一次(折衷,默认值);

3.1 Настройте запуск бэкенда:

так какRedisПо умолчанию интерфейс запускается и должен оставаться в текущем окне.ctrl + cвыйти, тоRedisВыйдет, не рекомендуется.

vi /etc/redis.conf

ИсправлятьRedisконфигурационный файл поместите старое значениеdaemonize noизменить на новое значениеdaemonize yes

3.2 Настройка доступа:

RedisПо умолчанию разрешен только локальный доступ, но иногда нам также требуется удаленный доступ к Redis.

vi /etc/redis.conf

Найдите конфигурацию линии привязки, по умолчанию:# bind 127.0.0.1

Удалить#Закомментируйте и измените на:bind 0.0.0.0Этот параметр становится Разрешить весь удаленный доступ. Если вы хотите указать ограниченный доступ, вы можете установить соответствующий IP.

3.3 Настройте ведение журнала Redis:

оказатьсяlogfileЭта строка конфигурации по умолчанию:logfile "", изменился наlogfile /var/log/redis_6379.log

3.4 Установите пароль запроса Redis:
vi /etc/redis.conf

Найдите эту строку, которая по умолчанию закомментирована:# requirepass foobared

удалить комментарий, поставитьfoobaredИзмените пароль, который вы хотите установить, например, я планирую установить его как:123456, поэтому я изменил на:requirepass "123456"

Перезапустите службу после модификации

После того, как у вас есть пароль, чтобы войти в клиент, вы должны получить к нему доступ следующим образом:redis-cli -h 127.0.0.1 -p 6379 -a 123456

4. Общие операции Redis

4.1 Запуск
/usr/local/redis/bin/redis-server /etc/redis.conf
4.2 Закрыть
/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 shutdown
4.3 Проверьте, запускается ли он
ps -ef | grep redis
4.4 Вход в клиент
redis-cli
4.5 Закройте клиент
redis-cli shutdown
4.6 Настройка конфигурации автоматического запуска
echo "/usr/local/redis/bin/redis-server /etc/redis.conf" >> /etc/rc.local
4.7 Открытый порт брандмауэра
添加规则:iptables -I INPUT -p tcp -m tcp --dport 6379 -j ACCEPT
保存规则:service iptables save
重启 iptables:service iptables restart

5. Зарегистрируйте Redis как системную службу

Добавьте сценарии запуска, приостановки и перезапуска службы Redis в каталог /etc/init.d:

vi /etc/init.d/redis

Содержание скрипта следующее:

#!/bin/sh  
#  
# redis - this script starts and stops the redis-server daemon  
#  
# chkconfig:   - 85 15  
# description:  Redis is a persistent key-value database  
# processname: redis-server  
# config:      /usr/local/redis/bin/redis-server
# config:      /etc/redis.conf  
# Source function library.  
. /etc/rc.d/init.d/functions  
# Source networking configuration.  
. /etc/sysconfig/network  
# Check that networking is up.  
[ "$NETWORKING" = "no" ] && exit 0  
redis="/usr/local/redis/bin/redis-server" 
prog=$(basename $redis)  
REDIS_CONF_FILE="/etc/redis.conf" 
[ -f /etc/sysconfig/redis ] && . /etc/sysconfig/redis  
lockfile=/var/lock/subsys/redis  
start() {  
    [ -x $redis ] || exit 5  
    [ -f $REDIS_CONF_FILE ] || exit 6  
    echo -n $"Starting $prog: "  
    daemon $redis $REDIS_CONF_FILE  
    retval=$?  
    echo  
    [ $retval -eq 0 ] && touch $lockfile  
    return $retval  
}  
stop() {  
    echo -n $"Stopping $prog: "  
    killproc $prog -QUIT  
    retval=$?  
    echo  
    [ $retval -eq 0 ] && rm -f $lockfile  
    return $retval  
}  
restart() {  
    stop  
    start  
}  
reload() {  
    echo -n $"Reloading $prog: "  
    killproc $redis -HUP  
    RETVAL=$?  
    echo  
}  
force_reload() {  
    restart  
}  
rh_status() {  
    status $prog  
}  
rh_status_q() {  
    rh_status >/dev/null 2>&1  
}  
case "$1" in  
    start)  
        rh_status_q && exit 0  
        $1  
        ;;  
    stop)  
        rh_status_q || exit 0  
        $1  
        ;;  
    restart|configtest)  
        $1  
        ;;  
    reload)  
        rh_status_q || exit 7  
        $1  
        ;;  
    force-reload)  
        force_reload  
        ;;  
    status)  
        rh_status  
        ;;  
    condrestart|try-restart)  
        rh_status_q || exit 0  
    ;;  
    *)  
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart| reload|orce-reload}"  
        exit 2  
esac

дать разрешение скрипту

chmod 755 /etc/init.d/redis

Запустить, остановить и перезапустить:

service redis start
service redis stop
service redis restart

Уже,RedisАвтономный сервер был построен, давайте посмотрим, как построить архитектуру Master-Plave.

Создайте архитектуру Redis master-slave

1. описание redis-сервера

172.16.2.185:6379 主

172.16.2.181:6379 从

2. Конфигурация архитектуры Redis master-slave

  • редактировать рабRedisВ файле конфигурации найдите строку 210 (примерно), которая должна быть закомментирована по умолчанию:# slaveof <masterip> <masterport>

  • Нам нужно убрать этот комментарий и заполнить IP и порт собственного хоста, например:slaveof 172.16.2.185 6379Если хост устанавливает пароль, вам все равно нужно его найти.masterauth <master-password>Эта линия, удалите комментарий, измените его наmasterauth 主机密码.

  • Перезапустите подчиненное устройство после завершения настройки.RedisСлужить

  • После перезагрузки введите имя хостаredis-cliв состоянииredis-cli -h 127.0.0.1 -p 6379 -a 123456,входить:INFO replicationТекущий хост может быть запрошенRedisВ какой роли он находится и какие ведомые устройства подключены к хосту.

информация о хосте172.16.2.185

# Replication
role:master
connected_slaves:1
slave0:ip=172.16.2.181,port=6379,state=online,offset=28,lag=1
master_replid:625ae9f362643da5337835beaeabfdca426198c7
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:28
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:28

Информация о рабах172.16.2.181

# Replication
role:slave
master_host:172.16.2.185
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:210
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:625ae9f362643da5337835beaeabfdca426198c7
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:210
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:210
  • На этом конфигурация master-slave завершена, и мы можем протестировать: мы входим в хостredis-cliгосударство, тоsetзначение, например:set myblog YouMeek.com
  • Мы переключаемся на рабаredis-cliВ состоянии получите только что установленное значение, чтобы увидеть, существует ли оно:get myblog, в этот момент мы можем обнаружить, что значение может быть получено.

3. Резюме архитектуры Redis master-slave

  • Следует отметить, что ведомая библиотека не имеет возможности записи данных, иначе будет сообщено об ошибке. Ведомая библиотека доступна только для чтения.

  • Преимущества архитектуры master-slave: Помимо уменьшения нагрузки на соединение с основной библиотекой, также можно отключить функцию сохранения в основной библиотеке и передать функцию сохранения в ведомую библиотеку для обработки.

  • Первая информация из конфигурации библиотеки подключена к основной библиотеке, второй источник из конфигурации библиотеки подключен к первому, начиная с библиотеки, если есть третий из библиотеки, мы можем поставить третий соединение из библиотеки, Подключите второй из библиотеки, так что нажмите.

Построение архитектуры высокой доступности Redis Sentinel

1. Автоматический переход на другой ресурс

  • Хотя при использовании конфигурации «ведущий-ведомый»RedisСделал бэкап, вроде все идеально. Но из-заRedisВ настоящее время поддерживается только репликация master-slave (репликация master-master не поддерживается).Redisповесил трубку отRedisМогут быть предоставлены только услуги чтения, а услуги записи не могут быть предоставлены. Итак, мы должны найти способ стать хозяиномRedisОн повесил трубку, так что отRedisобновить до мастераRedis.
  • Это требует автоматического аварийного переключения,Redis SentinelБлагодаря этой функции, когда мастерRedisКогда услуга не может быть оказана,Redis Sentinelможет быть преобразован изRedisобновить в основномRedis, и для другихRedisнастроить их для использования нового мастераRedisСделайте резервную копию копии.

Redis Sentinel架构图- 图片来自于CSDN 在Redis Sentinel环境下,jedis该如何配置

Примечание: сборкаRedis SentinelРекомендуется как минимум 3 сервера, но поскольку арендодатель ленив, в следующем варианте использования используются только 2 сервера.

Redis SentinelОсновные функции следующие:

  1. Мониторинг: постоянный контроль Sentinelmasterиslaveнормально ли работает.

  2. Уведомление: когда монитор находится под наблюдениемRedisКогда возникает проблема с экземпляром, вы можетеAPIУведомление системных администраторов и других приложений.

  3. Автоматическое отключение: еслиmasterне работает должным образом, Sentinel может запустить процесс аварийного переключения, которыйslaveобновитесь доmaster,другиеslaveперенастроен для использования новогоmaster, и приложение используетRedisНовый адрес, сообщенный сервером.

  4. поставщик конфигурации: дозорный какRedisАвторитетный источник для обнаружения клиента: клиент подключается к Sentinel, чтобы запросить текущую надежнуюmasterадрес г. Если возникает неисправность, Sentinel сообщает, что новый адрес.

По умолчанию каждыйSentinelУзел обновитRedisузлы и другиеSentinelузел отправляетPINGкоманду и определить, находится ли узел в сети или нет, по ответу узла.

если вdown-after-millisecondesВ течение миллисекунд, если действительный ответ не получен, узел будет определен как субъективно отключенный.

если узелmaster, тоSentinelузел пройдетsentinel is-master-down-by-addrкоманду другимsentinelУзел запрашивает решение узла, если больше, чем<quorum>количество узловmasterнедосягаемый, т.sentinelузел будетmasterСуждение как объективное в автономном режиме.

В это время каждыйSentinelпроведут переговоры и выберут лидераSentinelво главе сSentinelправильноmasterУзел выходит из строя при работе.

Аварийное переключение состоит из следующих трех операций:

  1. в целомslaveсервер, выбериslave, и преобразовать его вmaster.

  2. пусть другиеslaveСервер, скопируйте новые измененныеmaster.

  3. будет старымmasterустановить как новыйmasterизslave, так что когда старыйmasterКогда он вернется в сеть, это будет новыйmasterизslave.

2. Создайте архитектуру высокой доступности Redis Sentinel

Здесь используются два сервера, по одному на каждом сервереredis-serverиredis-sentinelСлужить.

описание redis-сервера

172.16.2.185:6379 主

172.16.2.181:6379 从

Описание redis-sentinel

172.16.2.185:26379

172.16.2.181:26379
2.1 Создайте файл конфигурации Redis

Если необходимо выполнить автоматическое аварийное переключение, рекомендуется, чтобы всеredis.confоба набораmasterauth, потому что автоматический сбой только перезапишет отношения ведущий-ведомый, т.е.slaveof, не будет записано автоматическиmasterauth. еслиRedisЕсли изначально пароль не установлен, его можно игнорировать.

RedisПрограмма уже установлена, осталось добавитьredis-sentinelСоответствующая конфигурация может быть,redis-sentinelСкопируйте файл конфигурации в каталог конфигурации системы/etc/Вниз,sentinel.confдаredis-sentinelфайл конфигурации,sentinel.confсуществуетRedisисходный каталог.

cp /usr/local/redis-4.0.2/sentinel.conf  /etc/

Исправлятьsentinel.confСодержимое конфигурационного файла следующее:

vi /etc/sentinel.conf
protected-mode no
sentinel monitor mymaster 172.16.2.185 6379 2
# redis在搭建时设置了密码,所以要进行密码配置
sentinel auth-pass mymaster “123456“
#5秒内mymaster没有响应,就认为SDOWN
sentinel down-after-milliseconds mymaster 5000  
sentinel failover-timeout  mymaster 15000

добавить в конце конфигурации

logfile /var/log/sentinel.log
pidfile  /var/run/sentinel.pid
daemonize yes

Описание файла конфигурации:

1.port: порт, на котором запущена текущая служба Sentinel.

2.dir: временная папка, используемая службой Sentinel при работе.

3.sentinel monitor master001 192.168.110.10163792: ​​Sentinel для мониторинга основного экземпляра redis с именем master001, IP-адрес основного экземпляра — это адрес хоста 192.168.110.101, номер порта 6379, а сбой основного экземпляра определяется, что в как минимум Sentinel согласился на два процесса, до тех пор, пока согласованное количество Sentinel не соответствует требованиям, автоматическое аварийное переключение не будет выполняться

4.Sntinel Down -After-Milliseconds Master001 30000: указывает, что Sentinel считает, что количество миллисекунд, необходимое для экземпляра Redis, было недопустимым. Когда пример превышает это время, он не возвращается или сразу возвращает ошибку, Sentinel помечает экземпляр как субъективно отключенный. Только один процесс Sentinel помечает экземпляр как субъективно отключенный и не обязательно вызывает автоматическую миграцию ошибки экземпляра: после того, как достаточное количество Sentinel пометит экземпляр как субъективно отключенный, экземпляр будет помечен как объективный отключенный, эта миграция будет выполняться только

5. Sentinel parallel-syncs master001 1: указывает, сколько подчиненных экземпляров Redis может синхронизировать новый главный экземпляр при выполнении аварийного переключения. В случае большего количества подчиненных экземпляров Redis, чем меньше число, тем дольше время синхронизации. требуется для завершения аварийного переключения

6. Sentinel failover-timeout master001 180000: если операция аварийного переключения не может быть завершена в течение этого времени (мс), считается, что аварийное переключение не удалось.

7.SEntinel Уведомление-сценарий: Указывает сценарий тревоги, вызываемый, когда Sentinel обнаруживает экземпляр зарегистрированного экземпляра Redis. Этот элемент конфигурации является необязательным, но очень часто используется

2.2 Открытые порты брандмауэра
添加规则:iptables -I INPUT -p tcp -m tcp --dport 26379 -j ACCEPT
保存规则:service iptables save
重启 iptables:service iptables restart
2.3 Запуск redis-sentinel
redis-sentinel  /etc/sentinel.conf

Актуальную служебную информацию можно просмотреть на любой машине

redis-cli -h 127.0.0.1 -p 26379

INFO sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=172.16.2.185:6379,slaves=1,sentinels=2

3. Автоматический отказоустойчивый тест

3.1 Остановить основной Redis
redis-cli -h 172.16.2.185 -p 6379 -a 123456 shutdown
3.2 Просмотр состояния мониторинга redis-sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=172.16.2.181:6379,slaves=1,sentinels=2

Выяснилось, что рабская библиотека была повышена до главной библиотеки.

3.3 Примечания
  • если ты остановишьсяmasterЗадний,Sentinelпоказать достаточноsdownпосле этого не появлялсяodownилиtry-failover, затем проверьте правильность пароля и других настроек

  • если ты остановишьсяmasterПозже при попытке переключения обнаруживается, что появляется логfailover-abort-not-elected, то ее можно решить в двух случаях:

  1. еслиRedisЭкземпляр не настроен
protected-mode yes
bind 172.16.2.185

затем вSentinelконфигурационный файл плюсprotected-mode noПросто

  1. еслиRedisЭкземпляр имеет конфигурацию
protected-mode yes
bind 172.16.2.185

затем вSentinelконфигурационный файл плюс

protected-mode yes
bind 172.16.2.185

На данный момент решение высокой доступности Redis создано.

VIP предоставляет внешний виртуальный IP-адрес для обеспечения высокой доступности

1. Обзор текущей ситуации

Подключение клиентской программы (например, программы JAVA)Redisпри необходимостиipиport,ноredis-serverВо время аварийного переключения основнойRedisявляется переменным, поэтомуipАдрес тоже меняется. Как клиентская программа воспринимает текущий мастерRedisизipА адрес и порт?redis-sentinelПредоставляет интерфейс для запроса любогоSentinel,ОтправитьSENTINEL get-master-addr-by-name <master name>Вы можете получить текущую первичнуюRedisизipиport.

каждый раз, когда клиент подключаетсяRedisпрежде, чтобыsentinelотправить запрос, получить мастерRedisизipиport, а затем используйте возвращенныйipиportсоединятьRedis.

Недостаток этого метода очевиден, каждая операцияRedisНеобходимо отправить как минимум два запроса на подключение, первый запросSentinel, второй запросRedis.

Лучший способ - использоватьVIP, конечно, это имеет определенные требования к настроенной среде, такие какRedisПостроен на облачном сервере Alibaba, может не поддерживатьVIP.

VIPПлан есть,RedisСистема всегда имеет один и тот же IP-адрес снаружи, когдаRedisПри сбое все, что вам нужно сделать, этоVIPраньшеRedisТеперь сервер переходит к новому мастеру.Redisна сервере.

Например: текущийRedisСистемаRedisизipадрес172.16.2.185,ТакVIP(172.16.2.250)направление172.16.2.185, клиентская программа используетVIP(172.16.2.250)адресная ссылкаRedisНа практике это текущий мастер.Redis, что позволяет избежатьSentinelпослать запрос.

быть главнымRedisвремя простоя, во время аварийного переключения,172.16.2.181на этом сервереRedisпродвижение – это главноеVIP(172.16.2.250)направление172.16.2.181, чтобы клиентской программе не нужно было изменять какой-либо код, соединение172.16.2.181этот мастерRedis.

2. Переместите VIP для обеспечения отказоустойчивости Redis

Так что вопрос теперь в том, как поступитьRedisВо время аварийного переключенияVIPДрейф к новому хозяинуRedisна сервере.

можно использовать здесьRedis Sentinelпараметрclient-reconfig-script, этот параметр настраивает сценарий выполнения,SentinelделаетfailoverКогда скрипт выполняется и передается 6 параметров<master-name>、 <role>、 <state>、 <from-ip>、 <from-port>、 <to-ip> 、<to-port><to-ip>новый хозяинRedisизIPадрес, что можно сделать в этом скриптеVIPДрифтовая операция.

sentinel client-reconfig-script mymaster /opt/notify_mymaster.sh

Изменить два сервераredis-sentinelконфигурационный файл/etc/sentinel.conf,增加上面一行。 затем в/opt/Создано в каталогеnotify_mymaster.shфайл скрипта, этот скрипт делаетVIPОперация дрейфа, как показано ниже:

vi /opt/notify_mymaster.sh
#!/bin/bash
echo "File Name: $0"
echo "Quoted Values: $@"
echo "Quoted Values: $*"
echo "Total Number of Parameters : $#"

MASTER_IP=${6}  #第六个参数是新主redis的ip地址
LOCAL_IP='172.16.2.185'  #当前服务器IP,主机172.16.2.185,从机172.16.2.181
VIP='172.16.2.250'
NETMASK='24'
INTERFACE='eth1'
if [ ${MASTER_IP} = ${LOCAL_IP} ]; then
     sudo /sbin/ip addr add ${VIP}/${NETMASK} dev ${INTERFACE}  #将VIP绑定到该服务器上
     sudo /sbin/arping -q -c 3 -A ${VIP} -I ${INTERFACE}
    exit 0
else
     sudo /sbin/ip addr del ${VIP}/${NETMASK} dev ${INTERFACE}   #将VIP从该服务器上删除
   exit 0
fi
exit 1  #如果返回1,sentinel会一直执行这个脚本

дать разрешение скрипту

chmod 755 /opt/notify_mymaster.sh

текущая основнаяRedisда172.16.2.185, что требует ручной привязкиVIPНа сервер.

/sbin/ip  addr add 172.16.2.250/24 dev eth1
/sbin/arping -q   -c 3 -A 172.16.2.250 -I eth1

Поскольку VIP может быть привязан только к одной машине, рекомендуется изменить его наbind 0.0.0.0добавить вredis.confсередина

vi /etc/redis.conf

настраиватьbind 0.0.0.0

Поскольку VIP может быть привязан только к одной машине, рекомендуется изменить его наbind 0.0.0.0добавить вsentinel.confсередина

vi /etc/sentinel.conf

настраиватьbind 0.0.0.0

перезагружатьRedis

service redis restart`

перезагружатьSentinel

redis-sentinel /etc/sentinel.conf

Тогда мы на другой машине172.16.2.181на, черезVIPхост доступа

redis-cli -h 172.16.2.250 -p 6379 -a 123456 INFO replication

Связь может быть выполнена в обычном режиме, и информация выглядит следующим образом:

# Replication
role:master
connected_slaves:1
slave0:ip=172.16.2.181,port=6379,state=online,offset=0,lag=0
master_replid:325b0bccab611d329d9c2cd2c35a1fe3c01ae196
master_replid2:c1f7a7d17d2c35575a34b00eb10c8abf32df2243
master_repl_offset:22246293
second_repl_offset:22241024
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:22237293
repl_backlog_histlen:9001

хост доступаSentinel

redis-cli -h 172.16.2.250 -p 26379 INFO sentinel

Связь может быть выполнена в обычном режиме, и информация выглядит следующим образом:

# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=172.16.2.185:6379,slaves=1,sentinels=3

Выключите хост нижеRedisservice и посмотрите, не переместится ли VIP на другой сервер.

redis-cli -h 172.16.2.185 -p 6379 -a 123456 shutdown

Посмотрите, был ли сделан переход

redis-cli -h 172.16.2.250 -p 26379 INFO sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=172.16.2.181:6379,slaves=1,sentinels=3

по запросуSentinelРаб найден172.16.2.181Продвигайте главное.

посетивVIPспособ подключенияRedis

redis-cli -h 172.16.2.250 -p 6379 -a 123456 INFO replication
# Replication
role:master
connected_slaves:0
master_replid:cab30a4083f35652053ffcd099d70b9aaf7a80f3
master_replid2:3da856dd33cce4bedd54926df6797b410f1ab9e8
master_repl_offset:74657
second_repl_offset:36065
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:74657

Из приведенной выше информации видно, чтоVIPУспешно дрифтовать. Поздравляю, удачи и удачи, ешь курицу на ночь.

Суммировать

Пока высокая доступностьRedisСлужба кеша была построена, и статья будет опубликована позже, чтобы научить вас пройтиJAVAсоединятьRedisвыполнять сопутствующие операции. Что касаетсяRedis ClusterКластерный план, подождите, пока у вас будет время его построить, а затем поделитесь им со всеми.

Справочная статья

Создайте систему высокой доступности Redis

Установка и настройка Redis

Репликация Redis, Sentinel для создания и обоснования

Redis Quick Start (перевод официального сайта)

Механизм и использование Redis Sentinel (1)

Redis Sentinel — высокая доступность Redis

Понимание Redis и настройка кластера master-slave и развертывание высокой доступности

Как настроить jedis в среде Redis Sentinel

Решение Redis Sentinel для переключения ведущий-ведомый (отказоустойчивость), подробная конфигурация

Пример теста отказоустойчивости Redis-3.2.1 master-slave