通過ansible+docker-compose快速安裝一主兩從redis+三sentinel

目錄

示例主機列表

架構參考

文件內容

安裝腳本

ansible變量,需修改

ansible配置文件和主機清單,需修改

運行方式

驗證故障轉移master

涉及redis鏡像和完整的腳本文件?

示例主機列表

架構參考

文件內容

安裝腳本

#!/bin/bashset -e
export path=`pwd`
export capath="/opt/.certs"
export docker_data=$(awk -F': ' '/docker_data_dir:/ {print $2}' group_vars/all.yml)
export ansible_log_dir="$path/log"
ssh_pass="sulibao"os_arch=$(uname -m)if [[ "$os_arch" == "x86_64" ]]; thenARCH="x86"echo -e "Detected Operating System: $OS, Architecture:X86"mkdir -p $ansible_log_dir
elif [[ "$os_arch" == "aarch64" ]]; thenARCH="arm64"echo -e "Detected Operating System: $OS, Architecture: ARM64"mkdir -p $ansible_log_dir
elseecho -e "Unsupported architecture detected: $os_arch"exit 1
fifunction check_arch() {if [ -f /etc/redhat-release ]; thenOS="RedHat"elif [ -f /etc/kylin-release ]; thenOS="kylin"elseecho "Unknow linux distribution."fiOS_ARCH=$(uname -a)if [[ "$OS_ARCH" =~ "x86" ]]thenARCH="x86"echo -e  "The operating system is $OS,the architecture is X86."elif [[ "$OS_ARCH" =~ "aarch" ]]thenARCH="arm64"echo -e  "The operating system is $OS,the architecture is Arm."fi
}function check_docker() {echo "Make sure docker is installed and running."if ! [ -x "$(command -v docker)" ]; thenecho "docker not find."create_docker_group_and_userinstall_dockerelseecho "docker exists."fiif ! systemctl is-active --quiet docker; thenecho "docker is not running."create_docker_group_and_userinstall_dockerelseecho "docker is running."fi
}function check_docker_compose() {if ! [ -x "$(command -v docker-compose)" ]; thenecho "docker-compose not find."install_docker_compose   elseecho "docker-compose exist."fi
}function create_docker_group_and_user() {if ! getent group docker >/dev/null 2>&1; thengroupadd dockerecho "docker group created successfully."elseecho "docker group already exists."fiif ! id -u docker >/dev/null 2>&1; thenuseradd -m -s /bin/bash -g docker dockerecho "docker user has been created and added to docker group."elseecho "docker user already exists."fi
}function install_docker() {echo "Installing docker."if [[ "$ARCH" == "x86" ]]thenexport DOCKER_OFFLINE_PACKAGE=$path/packages/docker/x86/docker-27.2.0.tgzelseexport DOCKER_OFFLINE_PACKAGE=$path/packages/docker/arm64/docker-27.2.0.tgzfitar axvf $DOCKER_OFFLINE_PACKAGE -C /usr/bin/ --strip-components=1cp -v -f $path/packages/docker/docker.service /usr/lib/systemd/system/test -d /etc/docker || mkdir -p /etc/dockerenvsubst '$docker_data' < $path/packages/docker/daemon.json > /etc/docker/daemon.jsonsystemctl stop firewalldsystemctl disable firewalldsystemctl daemon-reloadsystemctl enable docker.service --nowsystemctl restart docker || :maxSecond=60for i in $(seq 1 $maxSecond); doif systemctl is-active --quiet docker; thenbreakfisleep 1doneif ((i == maxSecond)); thenecho "Failed to start the docker server, please check the docker start log."exit 1fiecho "Docker has started successfully and the installation is complete."
}function install_docker_compose {echo "Installing docker-compose."if [[ "$ARCH" == "x86" ]]thenexport DOCKER_COMPOSE_OFFLINE_PACKAGE=$path/packages/docker-compose/x86/docker-compose-linux-x86_64cp -v -f $DOCKER_COMPOSE_OFFLINE_PACKAGE /usr/local/bin/docker-composeelseexport DOCKER_COMPOSE_OFFLINE_PACKAGE=$path/packages/docker-compose/arm64/docker-compose-linux-aarch64cp -v -f $DOCKER_COMPOSE_OFFLINE_PACKAGE /usr/local/bin/docker-composefi
}function load_ansible_image() {if [[ "$ARCH" == "x86" ]]thendocker load -i $path/packages/ansible/x86/ansible_images.tgzelsedocker load -i $path/packages/ansible/arm64/ansible_images.tgzfiecho -e "Loaded ansible image."
}function ensure_ansible() {echo -e "Checking the status of the ansible."if test -z "$(docker ps -a | grep ansible_sulibao)"; thenecho -e "Ansible is not running, will run."run_ansibleelseecho -e "Ansible is running, will restart."docker restart ansible_sulibaofi
}function run_ansible() {echo -e "Installing Ansible container."if [[ "$ARCH" == "x86" ]]thendocker run --name ansible_sulibao --network="host" --workdir=$path -d -e LANG=C.UTF-8 -e ssh_password=$ssh_pass --restart=always -v /etc/localtime:/etc/localtime:ro -v ~/.ssh:/root/.ssh -v $path:$path -v "$capath":"$capath" ansible:latest sleep 31536000elsedocker run --name ansible_sulibao --network="host" --workdir=$path -d -e LANG=C.UTF-8 -e ssh_password=$ssh_pass --restart=always -v /etc/localtime:/etc/localtime:ro -v ~/.ssh:/root/.ssh -v $path:$path -v "$capath":"$capath" ansible-arm:latest sleep 31536000fiecho -e "Installed Ansible container."
}function  create_ssh_key(){echo -e "Creating sshkey."docker exec -i ansible_sulibao /bin/sh -c 'echo -e "y\n"|ssh-keygen -t rsa -N "" -C "deploy@redis_sentinel" -f ~/.ssh/id_rsa_ansible_redis -q'  echo -e "\nCreated sshkey."}function copy_ssh_key() {echo -e "Copying sshkey."docker exec -i ansible_sulibao /bin/sh -c "cd $path && ansible-playbook  ssh-access.yml -e ansible_ssh_pass=$ssh_pass"  echo -e "\nCopied sshkey."
}function install_docker_slave() {echo -e "Installing docker for slave nodes."docker exec -i ansible_sulibao /bin/sh -c "cd $path && ansible-playbook  ./docker.yml"echo -e "\nInstalled docker for slave nodes."
}function install_redis() {echo -e "Install redis."docker exec -i ansible_sulibao /bin/sh -c "cd $path && ansible-playbook  ./redis.yml"echo -e "\nInstalled redis."
}check_arch
check_docker
check_docker_compose
load_ansible_image
ensure_ansible
create_ssh_key
copy_ssh_key
install_docker_slave
install_redis

ansible變量,需修改

vim group_vars/all.ymldocker_data_dir: /app/docker_data   #安裝的docker數據目錄
data_dir: /app     #存放redis文件的數據目錄
redis_sentinel_port: 26379    #sentinel端口
redis_pass: "sulibao"     #redis認證密碼
image_redis: "registry.cn-chengdu.aliyuncs.com/su03/redis:7.2.7"   #redis和sentinel使用的鏡像

ansible配置文件和主機清單,需修改

[root@test1 redis_data]# cat ansible.cfg 
[defaults]
inventory=./hosts
remote_user = root
transport= ssh
remote_port = 22
private_key_file= /root/.ssh/id_rsa_ansible_redis
log_path = ./log/ansible.log
stdout_callback=debug
host_key_checking=false
command_warnings=False
fact_caching_connections=/tmp/ansible_facts
fact_caching_timeout=86400
gathering=smart
pipelining=True
deprecation_warnings = False[ssh_connection]
ssh_args=-o ControlMaster=auto -o ControlPersist=60s
[root@test1 redis_data]# cat hosts 
[redis_master]    #初始master的地址
192.168.2.190
[redis_slave1]    #初始slave1的地址
192.168.2.191 
[redis_slave2]    #初始slave2的地址
192.168.2.192[redis_slave:children]
redis_slave1
redis_slave2[redis:children]
redis_master
redis_slave1
redis_slave2

運行方式

bash setup.sh

驗證故障轉移master

#初始集群信息,test1為master,test2、test3為slave
docker exec -it redis-master bash
root@test1:/data# redis-cli -a sulibao role
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
1) "master"
2) (integer) 35726
3) 1) 1) "192.168.2.191"2) "6379"3) "35726"2) 1) "192.168.2.192"2) "6379"3) "35585"#模擬master(test1)掛機,出現新master(test2),test3仍為slave
[root@test1 redis_data]# docker stop redis-master
redis-master
[root@test2 ~]# docker exec -it redis-slave1 bash
root@test2:/data# redis-cli -a sulibao role
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
1) "master"
2) (integer) 68953
3) 1) 1) "192.168.2.192"2) "6379"3) "68953"#舊master(test1)恢復,成為slave角色。此時master為test2,test1、test3為slave
[root@test1 redis_data]# docker start redis-master
redis-master
root@test2:/data# redis-cli -a sulibao role
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
1) "master"
2) (integer) 87291
3) 1) 1) "192.168.2.192"2) "6379"3) "87291"2) 1) "192.168.2.190"2) "6379"3) "87291"

涉及redis鏡像和完整的腳本文件?

腳本文件:通過網盤分享的文件:redis_data.tgz
鏈接: https://pan.baidu.com/s/12Hd22VSxdduktkyr7Lhijg?pwd=abvn 提取碼: abvn

鏡像文件:通過網盤分享的文件:redis-727-x86.tgz
鏈接: https://pan.baidu.com/s/1D4xQkrSU4opm-9RVhk6Gmg?pwd=aiw3 提取碼: aiw3

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/74833.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/74833.shtml
英文地址,請注明出處:http://en.pswp.cn/web/74833.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Apache Arrow 使用

下述操作參考 Building Arrow C — Apache Arrow v20.0.0.dev267 安裝依賴組件 sudo apt-get install \build-essential \ninja-build \cmake 下載源碼 git clone --recursive --shallow-submodules gitgithub.com:apache/arrow.git 配置 創建build目錄并且進入 mkdir a…

玩轉大語言模型——使用華為官方MindIE-Server鏡像方式部署DeepSeek模型

系列文章目錄 玩轉大語言模型——使用langchain和Ollama本地部署大語言模型 玩轉大語言模型——三分鐘教你用langchain提示詞工程獲得貓娘女友 玩轉大語言模型——ollama導入huggingface下載的模型 玩轉大語言模型——langchain調用ollama視覺多模態語言模型 玩轉大語言模型—…

MCP項目開發-一個簡單的RAG示例

MCP項目開發-一個簡單的RAG示例 前言 前言 客戶端是基于官網的例子改的&#xff0c;模型改成了openai庫連接僅僅使用基礎的RAG流程作為一個演示&#xff0c;包含了以下步驟 query改寫搜索&#xff1a;使用google serper重排序&#xff1a;使用硅基流動的api 大模型api也使用…

Tire樹(字典樹)

理論 上圖是一棵Trie樹&#xff0c;表示了關鍵字集合{“a”, “to”, “tea”, “ted”, “ten”, “i”, “in”, “inn”} 。從上圖可以歸納出Trie樹的基本性質&#xff1a; 根節點不包含字符&#xff0c;除根節點外的每一個子節點都包含一個字符。從根節點到某一個節點&…

厄瓜多爾主流收單方式:Pago Efectivo支付

PAGOEFECTIVO&#xff08;Pago Efectivo&#xff09;是秘魯主流的在線支付方式&#xff0c;由El Comercio Group開發&#xff0c;主要為用戶提供安全、便捷的在線支付解決方案&#xff0c;支持網銀和現金支付&#xff0c;適用于沒有信用卡或不愿透露銀行信息的消費者。 Pago Ef…

【文獻研究】含硼鋼中BN表面偏析對可鍍性的影響

《B 添加鋼的溶融 Zn めっき性に及ぼす BN 表面析出の影響》由JFE公司田原大輔等人撰寫。研究聚焦 B 添加鋼在低露點退火時 BN 形成對鍍鋅性的影響&#xff0c;對汽車用高強度鋼鍍鋅工藝優化意義重大。通過多組對比實驗&#xff0c;結合多種分析手段&#xff0c;明確了相關因素…

語法: ptr=malloc(size)

MALLOC( ) 語法: ptrmalloc(size) 參數: size是一個整數,表示被分配的字節個數; 返回值: 如果允許的話,返回值是一個指向被分配存儲器的指針;否則的話, 返回值是一個非指針; 功能: 該函數用來分配一定大小的空間給一個對象,其大小為size,但該空間的值為不確定值; 有…

JavaScript創建對象與構造函數

目錄 創建對象 一、創建對象的 5 種核心方式 1. 對象字面量&#xff08;直接量&#xff09; 2. 使用 Object.create() 3. 工廠模式 4. 構造函數模式 5. ES6 class 語法&#xff08;語法糖&#xff09; 二、構造函數與 new 關鍵字 1. 構造函數的作用 2. 構造函數的特征…

AIDD-人工智能藥物設計-深度學習助力提高兒童低級別膠質瘤復發風險預測的準確性

深度學習助力提高兒童低級別膠質瘤復發風險預測的準確性 兒童低級別膠質瘤&#xff08;pLGG&#xff09;是一種常見于兒童患者中的腦腫瘤&#xff0c;盡管大多數時候被認為是良性腫瘤&#xff0c;但是它們仍然可能導致相關癥狀和并發癥的發生&#xff0c;包括但不限于頭疼、癲…

redis的數據類型(1)

https://redis.io/docs/latest/develop/data-types/strings/ 社區版支持&#xff1a; String&#xff0c;字符串 Hash&#xff0c;key-value格式 List&#xff0c;根據插入順序排序 Set&#xff0c;集合 Sorted set&#xff0c;有排序 Stream&#xff0c; Bitmap&#xff0c; …

Nacos配置中心使用

Nacos配置中心 Nacos除了可以做注冊中心,&#x1f517;Nacos下載和注冊中心教程,同樣可以做配置管理來使用。 一、統一配置管理 當微服務部署的實例越來越多&#xff0c;達到數十、數百時&#xff0c;逐個修改微服務配置就顯得十分的不方便&#xff0c;而且很容易出錯。我們…

OpenCV輪廓檢測全面解析:從基礎到高級應用

一、概述 輪廓檢測是計算機視覺中的基礎技術&#xff0c;用于識別和提取圖像中物體的邊界。與邊緣檢測不同&#xff0c;輪廓檢測更關注將邊緣像素連接成有意義的整體&#xff0c;形成封閉的邊界。 輪廓檢測的核心價值 - 物體識別&#xff1a;通過輪廓可以識別圖像中的獨立物體…

Jenkins學習(B站教程)

文章目錄 1.持續集成CI2.持續交付CD3.持續部署4.持續集成的操作流程5.jenkins簡介6.后續安裝部署&#xff0c;見視頻 bilibili視頻 Jenkins是一個開源的、提供友好操作界面的持續集成(CI)工具&#xff0c;起源于Hudson&#xff08;Hudson是商用的&#xff09;&#xff0c;主要用…

ARM-UART

時鐘選擇PLCK,超時3ms自動發送&#xff0c;設置發送8位的緩沖區&#xff0c;且發送中斷 設置觸發深度&#xff0c;達到8字節將緩沖區數據發憷 中斷處理函數

Rust所有權詳解

文章目錄 Rust所有權所有權規則作用域 內存和分配移動與克隆棧空間堆空間 關于函數的所有權機制作為參數作為返回值 引用與租借垂懸引用 Rust所有權 C/C中我們對于堆內存通常需要自己手動管理&#xff0c;手動申請和釋放&#xff0c;即便有了智能指針&#xff0c;對于效率的影…

【在線OJ項目測試報告】

朋友們、伙計們&#xff0c;我們又見面了&#xff0c;本期來給大家帶來關于在線OJ項目的測試報告&#xff0c;如果看完之后對你有一定的啟發&#xff0c;那么請留下你的三連&#xff0c;祝大家心想事成&#xff01; C 語 言 專 欄&#xff1a;C語言&#xff1a;從入門到精通 數…

【HFP】藍牙HFP應用層核心技術研究

免提配置文件(Hands-Free Profile, HFP)作為實現設備間音頻通信的關鍵協議,廣泛應用于車載系統、藍牙耳機等場景。本文將基于最新技術規范,深入剖析HFP應用層的功能要求、協議映射及編解碼器支持,為藍牙開發工程師提供詳盡的技術指南。 一、HFP應用層功能全景圖 HFP定義…

橫掃SQL面試——PV、UV問題

&#x1f4ca; 橫掃SQL面試&#xff1a;UV/PV問題 &#x1f31f; 什么是UV/PV&#xff1f; 在數據領域&#xff0c;UV&#xff08;Unique Visitor&#xff0c;獨立訪客&#xff09; 和 PV&#xff08;Page View&#xff0c;頁面訪問量&#xff09; 是最基礎也最重要的指標&…

【C++】第八節—string類(上)——詳解+代碼示例

hello&#xff0c;又見面了&#xff01; 云邊有個稻草人-CSDN博客 C_云邊有個稻草人的博客-CSDN博客——C專欄&#xff08;質量分高達97&#xff01;&#xff09; 菜鳥進化中。。。 目錄 一、為什么要學習string類&#xff1f; 1.1 C語言中的字符串 1.2 面試題(暫不做講解) …

如何判斷JVM中類和其他類是不是同一個類

如何判斷JVM中的類是否為同一個類 在Java虛擬機(JVM)中&#xff0c;判斷兩個類是否相同需要同時滿足以下三個條件&#xff1a; 1. 類全限定名必須相同 包括包名類名的完整路徑必須完全一致例如&#xff1a;java.lang.String和com.example.String被視為不同類 2. 加載該類的…