知识点
- Redis启动默认就是主节点
- 使用
slaveof <hostname> <port>
命令将主节点转换为从节点启动服务
准备三份配置文件:master.conf、slave-1.conf、slave-2.conf
master.conf
port 9000 #监听9000端口
logfile "/data/log" #配置log文件位置
appendonly yes #打开AOF
slave-1.conf
port 9001 #监听9001端口
slaveof localhost 9000 #指定主节点的主机名和端口
logfile "/data/log" #配置log文件位置
appendonly yes #打开AOF
slave-2.conf
port 9002 #监听9002端口
slaveof localhost 9000 #指定主节点的主机名和端口
logfile "/data/log" #配置log文件位置
appendonly yes #打开AOF
然后使用Docker运行三个节点:
master
docker run -d --name redis-master-9000 --net=host -v $PWD/master-data:/data \
-v $PWD/master.conf:/etc/redis.conf redis redis-server /etc/redis.conf
slave1
docker run -d --name redis-slave1-9001 --net=host -v $PWD/slave1-data:/data \
-v $PWD/slave-1.conf:/etc/redis.conf redis redis-server /etc/redis.conf
slave2
docker run -d --name redis-slave2-9002 --net=host -v $PWD/slave2-data:/data \
-v $PWD/slave-2.conf:/etc/redis.conf redis redis-server /etc/redis.conf
连接服务(Go)
注意修改代码中的主机名和端口号
package main
import (
"fmt"
"github.com/go-redis/redis"
"math/rand"
"strconv"
"testing"
)
const MasterSlaveSycnKey = "m-s-sync"
var (
masterOptions = redis.Options{
Addr: "192.168.124.25:9000",
Password: "",
DB: 0,
}
slave1Options = redis.Options{
Addr: "192.168.124.25:9001",
Password: "",
DB: 0,
}
slave2Options = redis.Options{
Addr: "192.168.124.25:9002",
Password: "",
DB: 0,
}
)
func TestConnect(t *testing.T) {
masterClient := redis.NewClient(&masterOptions)
slave1Client := redis.NewClient(&slave1Options)
slave2Client := redis.NewClient(&slave2Options)
_, err := masterClient.Ping().Result()
if err != nil {
t.Fatal("主节点连接失败。原因:", err)
}
_, err = slave1Client.Ping().Result()
if err != nil {
t.Fatal("1号从节点连接失败。原因:", err)
}
_, err = slave2Client.Ping().Result()
if err != nil {
t.Fatal("2号从节点连接失败。原因:", err)
}
fmt.Println("所有节点连接成功")
}
func TestSycn(t *testing.T) {
masterClient := redis.NewClient(&masterOptions)
slave1Client := redis.NewClient(&slave1Options)
slave2Client := redis.NewClient(&slave2Options)
randomNum := rand.Int()
_, err := masterClient.Set(MasterSlaveSycnKey, randomNum, 0).Result()
if err != nil {
t.Fatal("主节点设置随机值失败!原因:", err)
}
resNum, err := slave1Client.Get(MasterSlaveSycnKey).Result()
if err != nil {
t.Fatal("1号从节点读取随机值失败!原因:", err)
}
if resNum != strconv.Itoa(randomNum) {
t.Fatal("1号从节点复制同步失败。期望值:", randomNum, "; 实际值:", resNum)
}
resNum, err = slave2Client.Get(MasterSlaveSycnKey).Result()
if err != nil {
t.Fatal("2号从节点读取随机值失败!原因:", err)
}
if resNum != strconv.Itoa(randomNum) {
t.Fatal("2号从节点复制同步失败。期望值:", randomNum, "实际值:", resNum)
}
fmt.Println("一主二从同步成功")
}