1. 主从复制
------------------------------------------
操作步骤:
1.先将linux虚拟机关闭,之后克隆一个。
2.启动两个虚拟机:master(主)和slave(从)
3. 在slave(从)中配置一下ip地址
# ifconfig eth0 192.168.128.229
# ping 一下看看通不通。
4. 配置从机
进入:配置文件
slaveof 192.168.128.228 6379 //配置连接主机的Redis的ip和端口
masterauth 密码 //配置连接密码
最后启动slave(从)机的Redis服务。
其他:可以通过info命令中的role属性查看自己角色是master、slave
2. 哨兵
------------------------------------------
操作步骤:
1.创建sentinel.conf 文件
2.文件内容
port 6390
bind 127.0.0.1
sentinel monitor mymaster 127.0.0.1 6380 1
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 15000
sentinel auth-pass mymaster 123456
protected-mode yes
/**
1. port :当前Sentinel服务运行的端口
2.sentinel monitor mymaster 127.0.0.1 6379 2:Sentinel去监视一个名为mymaster的主redis实例,这个主实例的IP地址为本机地址127.0.0.1,端口号为6379,而将这个主实例判断为失效至少需要2个 Sentinel进程的同意,只要同意Sentinel的数量不达标,自动failover就不会执行
3.sentinel down-after-milliseconds mymaster 5000:指定了Sentinel认为Redis实例已经失效所需的毫秒数。当 实例超过该时间没有返回PING,或者直接返回错误,那么Sentinel将这个实例标记为主观下线。只有一个 Sentinel进程将实例标记为主观下线并不一定会引起实例的自动故障迁移:只有在足够数量的Sentinel都将一个实例标记为主观下线之后,实例才会被标记为客观下线,这时自动故障迁移才会执行
4.sentinel parallel-syncs mymaster 1:指定了在执行故障转移时,最多可以有多少个从Redis实例在同步新的主实例,在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长
5.sentinel failover-timeout mymaster 15000:如果在该时间(ms)内未能完成failover操作,则认为该failover失败
**/
3.启动
方法一
redis-sentinel redis-sentinel-26379.conf
方法二
redis-server.exe sentinel.conf --sentinel
port :当前Sentinel服务运行的端口
bind 127.0.0.1
sentinel monitor mymaster 127.0.0.1 6379 2
Sentinel去监视一个名为mymaster的主redis实例,这个主实例的IP地址为本机地址127.0.0.1,端口号为6379,而将这个主实例判断为失效至少需要2个 Sentinel进程的同意,只要同意Sentinel的数量不达标,自动failover就不会执行
# 哨兵监听的主服务器 后面的2表示主机挂掉以后进行投票,只需要1票就可以从机变主机
sentinel down-after-milliseconds mymaster 5000
指定了Sentinel认为Redis实例已经失效所需的毫秒数。当 实例超过该时间没有返回PING,或者直接返回错误,那么Sentinel将这个实例标记为主观下线。只有一个 Sentinel进程将实例标记为主观下线并不一定会引起实例的自动故障迁移:只有在足够数量的Sentinel都将一个实例标记为主观下线之后,实例才会被标记为客观下线,这时自动故障迁移才会执行
# 5s内mymaster无响应,则认为mymaster宕机了
sentinel parallel-syncs mymaster 1
指定了在执行故障转移时,最多可以有多少个从Redis实例在同步新的主实例,在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长
# 执行故障转移时, 最多有1个从服务器同时对新的主服务器进行同步
sentinel failover-timeout mymaster 15000
如果在该时间(ms)内未能完成failover操作,则认为该failover失败
#如果15秒后,mysater仍没启动过来,则启动failover
sentinel auth-pass mymaster 123456
# 设置哨兵sentinel 连接主从的密码 注意必须为主从设置一样的验证密码,没有的话不用设置
protected-mode yes
/*入口*/
public function index()
{
$redis = new \Redis();
$redis->connect('127.0.0.1','6390') or die('Can not Content Redis!');
$redis->auth('123456');
//获取主库列表及其状态信息
$result = $redis->rawCommand('SENTINEL', 'masters');
///dump($result);
$arrayData = $this->parseArrayResult($result);
dump($arrayData);
//根据所配置的主库redis名称获取对应的信息
//master_name应该由运维告知(也可以由上一步的信息中获取)
//$result = $redis->rawCommand('SENTINEL', 'master', $master_name);
$result = $redis->rawCommand('SENTINEL', 'master', $arrayData[0]['name']);
$arrayData = $this->parseArrayResult($result);
dump($arrayData);
//根据所配置的主库redis名称获取其对应从库列表及其信息
$result = $redis->rawCommand('SENTINEL', 'slaves', 'mymaster');
$arrayData = $this->parseArrayResult($result);
dump($arrayData);
die;
}
//这个方法可以将以上sentinel返回的信息解析为数组
private function parseArrayResult(array $data)
{
$result = array();
$count = count($data);
for ($i = 0; $i < $count;) {
$record = $data[$i];
if (is_array($record)) {
$result[] = $this->parseArrayResult($record);
$i++;
} else {
$result[$record] = $data[$i + 1];
$i += 2;
}
}
return $result;
}
以下PHP部分代码:
//可能用到的部分命令,其他可以去官方文档查看
//获取主库列表及其状态信息
$result = $redis->rawCommand('SENTINEL', 'masters');
//根据所配置的主库redis名称获取对应的信息
//master_name应该由运维告知(也可以由上一步的信息中获取)
$result = $redis->rawCommand('SENTINEL', 'master', $master_name);
//根据所配置的主库redis名称获取其对应从库列表及其信息
$result = redis->rawCommand('SENTINEL', 'slaves', $master_name);
//获取特定名称的redis主库地址
$result = $redis->rawCommand('SENTINEL', 'get-master-addr-by-name', $master_name)
//这个方法可以将以上sentinel返回的信息解析为数组
function parseArrayResult(array $data)
{
$result = array();
$count = count($data);
for ($i = 0; $i < $count;) {
$record = $data[$i];
if (is_array($record)) {
$result[] = parseArrayResult($record);
$i++;
} else {
$result[$record] = $data[$i + 1];
$i += 2;
}
}
return $result;
}