1、準備條件
- 使用vmware15安裝centos7
- 虛擬機上安裝了docker,yum install docker
- 從yum中直接拉取最新官方redis鏡像,yum pull redis
- centos7中自帶防火牆工具firewall,檢查是否啓動並啓動
- 至少得簡單知道redis的集羣原理和配置流程
2、開始之前的說明
- reids集羣至少需要三臺master節點和對應的slave節點,這裏一共創建8臺redis節點,四主四副。
- 使用主機的端口從8001-8008,即 8001 8002 8003 8004 8005 8006 8007 8008,這八個,以及用於redis集羣通信的18001-18008端口,一共16個端口。
- 假設當前的目錄位置是/home/redis,如果沒有,則創建對應目錄即可
2、開始
- 開放端口。命令,firewall-cmd --zone=public --permanent --add-port=xxx/tcp ,將xxx替換爲那16個端口,執行一遍,最後執行 firewall-cmd --reload,可以使用 firewall-cmd --list-all 查看是否開放端口成功。
- 爲每個redis節點創建一個文件目錄,用於存放它的配置文件和數據。目錄名就按照端口命名。爲了簡化創建目錄以及它的配置文件。可以將以下代碼保存爲bash腳本,添加運行權限,這裏命名爲 redis.conf.sh:
startport=$1
times=$2
while(( $times>0 ));
do
mkdir $startport
cd $startport
touch redis.conf
echo "port $startport" >> redis.conf
echo "cluster-enabled yes">>redis.conf
echo "cluster-config-file nodes.conf">>redis.conf
echo "cluster-node-timeout 5000">>redis.conf
echo "appendonly yes">>redis.conf
cd ..
let "times--"
let "startport++"
done
- 現在所在的目錄是/home/redis,運行腳本,./redis.conf.sh 8001 8,第一個參數是集羣redis的起始端口,第二個參數是累加命名創建多少個目錄,之後會在當前目錄下生成8個文件,文件名從8001到8008,並會在對應目錄下生成redis.conf文件,這是每個redis節點的集羣配置文件,對配置文件的配置不明白可以去官網查詢。這裏是最簡單配置。
- 使用配置文件啓動8個redis,直接複製以下所有命令執行即可,確保你現在的目錄是/home/redis,docker運行在–net=host,這是必須的,這可使得JAVA中的JedisCluster正常工作:
docker run --restart=always -d --net=host --name redis01 -v /home/redis/8001/data/:/data/ -v /home/redis/8001/redis.conf:/usr/local/etc/redis/redis.conf redis:latest redis-server /usr/local/etc/redis/redis.conf&&
docker run --restart=always -d --net=host --name redis02 -v /home/redis/8002/data/:/data/ -v /home/redis/8002/redis.conf:/usr/local/etc/redis/redis.conf redis:latest redis-server /usr/local/etc/redis/redis.conf&&
docker run --restart=always -d --net=host --name redis03 -v /home/redis/8003/data/:/data/ -v /home/redis/8003/redis.conf:/usr/local/etc/redis/redis.conf redis:latest redis-server /usr/local/etc/redis/redis.conf&&
docker run --restart=always -d --net=host --name redis04 -v /home/redis/8004/data/:/data/ -v /home/redis/8004/redis.conf:/usr/local/etc/redis/redis.conf redis:latest redis-server /usr/local/etc/redis/redis.conf&&
docker run --restart=always -d --net=host --name redis05 -v /home/redis/8005/data/:/data/ -v /home/redis/8005/redis.conf:/usr/local/etc/redis/redis.conf redis:latest redis-server /usr/local/etc/redis/redis.conf&&
docker run --restart=always -d --net=host --name redis06 -v /home/redis/8006/data/:/data/ -v /home/redis/8006/redis.conf:/usr/local/etc/redis/redis.conf redis:latest redis-server /usr/local/etc/redis/redis.conf&&
docker run --restart=always -d --net=host --name redis07 -v /home/redis/8007/data/:/data/ -v /home/redis/8007/redis.conf:/usr/local/etc/redis/redis.conf redis:latest redis-server /usr/local/etc/redis/redis.conf&&
docker run --restart=always -d --net=host --name redis08 -v /home/redis/8008/data/:/data/ -v /home/redis/8008/redis.conf:/usr/local/etc/redis/redis.conf redis:latest redis-server /usr/local/etc/redis/redis.conf&&\docker ps -n8
- 當全部啓動成功,執行下面的命令進入到redis01容器中,這個容器是8個之一即可:
docker exec -it redis01 /bin/bash
- 將它們加入到一個集羣中,承接上面的命令,在容器中執行以下命令,注意,將xxx替換成docker所在主機的ip地址,會有提示是否自動分配solt,直接確定即可,當最後join成功,則完成集羣搭建。如果一直卡在join階段,那是集羣通信失敗,和網絡有關:
redis-cli --cluster create xxx:8001 xxx:8002 xxx:8003 xxx:8004 xxx:8005 xxx:8006 xxx:8007 xxx:8008 --cluster-replicas 1
3、其他可能會用到的命令
當前目錄 /home/redis
- 停止並刪除所有的redis容器
docker stop redis01 redis02 redis03 redis04 redis05 redis06 redis07 redis08 && docker rm redis01 redis02 redis03 redis04 redis05 redis06 redis07 redis08 && docker ps -n8
- 刪除由redis.conf.sh腳本創建的目錄
rm -rf 8001 8002 8003 8004 8005 8006 8007 8008
- 批量開放防火牆端口
firewall-cmd --zone=public --permanent --add-port=18001/tcp --add-port=8001/tcp --add-port=8002/tcp --add-port=18002/tcp --add-port=8003/tcp --add-port=18003/tcp \
--add-port=18004/tcp --add-port=8004/tcp --add-port=8005/tcp --add-port=18005/tcp --add-port=8006/tcp --add-port=18006/tcp -add-port=8007/tcp --add-port=18007/tcp -add-port=8008/tcp --add-port=18008/tcp &&
firewall-cmd --reload
4、最後的話
- redis集羣的加入階段,即運行 redis-cli --cluster create 命令的時候,後面的參數指定的是每個節點的ip和端口,這裏需要確保每個節點在其本機上能通過這些ip+端口相互訪問,並且指定的端口號加10000的端口也能相互訪問,才能加入集羣成功,否則就會一直卡在加入階段。所以在這個地方需要指定每個節點的具體ip,如果是局域網ip,就需要保證所有ip在同一局域網,這裏可以用docker命令創建虛擬網卡,並在啓動容器時候指定ip和端口,可以保證節點加入集羣成功,但是這可能會使得 JAVA中的JedisCluster工具無法工作,其原因就是JedisCluster會獲取集羣節點加入集羣時候的被指定的ip和端口來作爲集羣的訪問地址,如果這些ip與JedisCluster不在一個局域網,那JedisCluster就會訪問這個集羣失敗,所以在這裏使用 --net=host模式,只要docker所在主機能被外網訪問,JedisCluster就可以正常工作。
- 建議使用docker-compose來管理集羣。
- 上面的步驟在寫完後未驗證成功性,內容是不久前搭建集羣成功後的簡單記錄,可能會在按照步驟搭建集羣失敗,請多多思考與包涵。日期:2019年10月25日。