Linux反彈shell(一)檔案描述符與重定向
阿新 • • 發佈:2021-06-11
一、搭建叢集
Redis Cluster叢集要求必須有3個master才構成一個叢集,所以我這裡採用3主3從的方式,實際生產中的高可用至少3主6從
(1)使用docker-compose啟動6個redis容器
version: '3.7' services: redis7001: image: 'redis:6.2.4' container_name: redis7001 command: ["redis-server", "/etc/redis/redis.conf"] volumes: - /opt/docker/redis/7001/redis.conf:/etc/redis/redis.conf - /opt/docker/redis/7001/data:/data ports: - "7001:7001" - "17001:17001" environment: - TZ=Asia/Shanghai redis7002: image: 'redis:6.2.4' container_name: redis7002 command: ["redis-server", "/etc/redis/redis.conf"] volumes: - /opt/docker/redis/7002/redis.conf:/etc/redis/redis.conf - /opt/docker/redis/7002/data:/data ports: - "7002:7002" - "17002:17002" environment: - TZ=Asia/Shanghai redis7003: image: 'redis:6.2.4' container_name: redis7003 command: ["redis-server", "/etc/redis/redis.conf"] volumes: - /opt/docker/redis/7003/redis.conf:/etc/redis/redis.conf - /opt/docker/redis/7003/data:/data ports: - "7003:7003" - "17003:17003" environment: - TZ=Asia/Shanghai redis7004: image: 'redis:6.2.4' container_name: redis7004 command: ["redis-server", "/etc/redis/redis.conf"] volumes: - /opt/docker/redis/7004/redis.conf:/etc/redis/redis.conf - /opt/docker/redis/7004/data:/data ports: - "7004:7004" - "17004:17004" environment: - TZ=Asia/Shanghai redis7005: image: 'redis:6.2.4' container_name: redis7005 command: ["redis-server", "/etc/redis/redis.conf"] volumes: - /opt/docker/redis/7005/redis.conf:/etc/redis/redis.conf - /opt/docker/redis/7005/data:/data ports: - "7005:7005" - "17005:17005" environment: - TZ=Asia/Shanghai redis7006: image: 'redis:6.2.4' container_name: redis7006 command: ["redis-server", "/etc/redis/redis.conf"] volumes: - /opt/docker/redis/7006/redis.conf:/etc/redis/redis.conf - /opt/docker/redis/7006/data:/data ports: - "7006:7006" - "17006:17006" environment: - TZ=Asia/Shanghai
[root@shang redis]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e3018a083b37 redis:6.2.4 "docker-entrypoint.s…" 13 seconds ago Up 4 seconds 0.0.0.0:7003->7003/tcp, :::7003->7003/tcp, 6379/tcp, 0.0.0.0:17003->17003/tcp, :::17003->17003/tcp redis7003 911dc36fe35a redis:6.2.4 "docker-entrypoint.s…" 13 seconds ago Up 4 seconds 0.0.0.0:7005->7005/tcp, :::7005->7005/tcp, 6379/tcp, 0.0.0.0:17005->17005/tcp, :::17005->17005/tcp redis7005 efabccd7769c redis:6.2.4 "docker-entrypoint.s…" 13 seconds ago Up 6 seconds 0.0.0.0:7004->7004/tcp, :::7004->7004/tcp, 6379/tcp, 0.0.0.0:17004->17004/tcp, :::17004->17004/tcp redis7004 db48c12796cb redis:6.2.4 "docker-entrypoint.s…" 13 seconds ago Up 4 seconds 0.0.0.0:7002->7002/tcp, :::7002->7002/tcp, 6379/tcp, 0.0.0.0:17002->17002/tcp, :::17002->17002/tcp redis7002 c717621d2c7b redis:6.2.4 "docker-entrypoint.s…" 13 seconds ago Up 4 seconds 0.0.0.0:7006->7006/tcp, :::7006->7006/tcp, 6379/tcp, 0.0.0.0:17006->17006/tcp, :::17006->17006/tcp redis7006 10fd3e24f10f redis:6.2.4 "docker-entrypoint.s…" 13 seconds ago Up 4 seconds 0.0.0.0:7001->7001/tcp, :::7001->7001/tcp, 6379/tcp, 0.0.0.0:17001->17001/tcp, :::17001->17001/tcp redis7001
(2)檢視redis叢集 [cluster]
表示為叢集,但此時它們之間並沒有建立聯絡,也沒有分配slot。
[root@shang 7001]# ps -ef | grep redis polkitd 3888 3867 0 09:10 ? 00:00:02 redis-server *:7001 [cluster] polkitd 4143 4120 0 09:14 ? 00:00:01 redis-server *:7002 [cluster] polkitd 4257 4235 0 09:17 ? 00:00:01 redis-server *:7003 [cluster] polkitd 4373 4352 0 09:20 ? 00:00:00 redis-server *:7004 [cluster] polkitd 4490 4469 0 09:22 ? 00:00:00 redis-server *:7005 [cluster] polkitd 4604 4581 0 09:23 ? 00:00:00 redis-server *:7006 [cluster] root 4667 1576 0 09:24 pts/0 00:00:00 grep --color=auto redis [root@shang 7001]# docker exec -it redis7001 redis-cli -p 7001 # 進入埠為7001的redis7001容器 127.0.0.1:7001> cluster nodes # 檢視叢集節點資訊 87346232e7666c772d304518fa4215804be3f576 :7001@17001 myself,master - 0 0 0 connected
(3)建立聯絡,並分配slot
# 檢視幫助命令
[root@shang 7001]# docker exec -it redis7001 redis-cli --cluster help
# meet
create host1:port1 ... hostN:portN
--cluster-replicas <arg>
docker exec -it redis7001 redis-cli --cluster create 192.168.16.3:7001 192.168.16.3:7002 192.168.16.3:7003 192.168.16.3:7004 192.168.16.3:7005 192.168.16.3:7006 --cluster-replicas 1
建立cluster聯絡,按照 1:1 的方式(3:3),前三個為master,後三個為slave。
如果--cluster-replicas 2
,表示按照 1:2 的方式(3:6),前三個為master,後三個為slave
(4)檢視是否搭建成功
[root@shang 7001]# docker exec -it redis7001 redis-cli -p 7001 # 進入埠為7001的redis7001容器
127.0.0.1:7001> cluster nodes # 檢視叢集節點資訊
二、叢集擴容
docker exec -it redis7001 redis-cli --cluster help # 檢視幫助命令
add-node new_host:new_port existing_host:existing_port # 新redis 叢集中任一redis
--cluster-slave # 標誌為從機
--cluster-master-id <arg> # 指定從屬於哪個主機,master-id
# 擴容一個slave
docker exec -it redis7001 redis-cli --cluster add-node 192.168.16.3:7007 192.168.16.3:7001 --cluster-slave --cluster-master-id 87346232e7666c772d304518fa4215804be3f576
# 擴容一個master,並分配slot
docker exec -it redis7001 redis-cli --cluster add-node 192.168.16.3:7008 192.168.16.3:7001
reshard host:port # 叢集任一節點
--cluster-from <arg> # 帶有slot的master節點id,多個以 , 隔開
--cluster-to <arg> # 分配給哪個master節點id,多個以 , 隔開
--cluster-slots <arg> # 總共分配多少slot
--cluster-yes # 跳過確認
--cluster-timeout <arg> #
--cluster-pipeline <arg> # 控制每次批量遷移鍵的數量,預設為10
--cluster-replace
docker exec -it redis7001 redis-cli --cluster reshard 192.168.16.3:7007 --cluster-from 87346232e7666c772d304518fa4215804be3f576,4979d1b009f30576c4ba7587c01176275cf81628 --cluster-to 90afcac7725cac92e9b064f3a71348b9913c7eb3 --cluster-slots 1000 --cluster-yes
三、叢集縮容
先移除某一個master節點的所有slave,避免選舉為master。
移除master之前,要將master上的slot分配給其它存活的master,然後再刪除當前master,避免資料丟失。
# 刪除slave
del-node host:port node_id # 任一叢集節點 需要刪除的節點id
docker exec -it redis7001 redis-cli --cluster del-node 192.168.16.3:7001 3a29bd1d4e885cdfe5e03185183b88da2cfd5115
# 分離slot
docker exec -it redis7001 redis-cli --cluster reshard 192.168.16.3:7001 --cluster-from 90afcac7725cac92e9b064f3a71348b9913c7eb3 --cluster-to 05abce1703ec1aca5e38548ca2c252c4713c5840 --cluster-slots 1000 --cluster-yes
docker exec -it redis7001 redis-cli --cluster del-node 192.168.16.3:7001 90afcac7725cac92e9b064f3a71348b9913c7eb3 # 移除master 7008