知识点
- 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 mainimport ("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("一主二从同步成功")}
