1. #!/bin/bash
    2. # cluster install Service(Version 1.0) -- by Fei Yi Song.
    3. # This script is used for cluster deployment and MySQL dual master configuration
    4. #
    5. # Debian/Ubuntu Linux systems. (May 10, 2019)
    6. # (GNU/General Public License version 2.0)
    7. #
    8. # For Centos 7 and up, Linux lzone_zkong_cluster_01 3.10.0-862.el7.x86_64.
    9. #
    10. # ...And away we go!
    11. set -xu
    12. echo "----------------------------环境变量区域--------------------------"
    13. user=$USER
    14. host=$HOSTNAME
    15. MySQL_Confugure="/usr/local/esl/my.cnf"
    16. Auto=`awk -F "-" 'NR==2{print $(NF-1)}' /usr/local/esl/mysql/auto.cnf`
    17. MySQL_User="root"
    18. MySQL_PASSWD="Zkong_1234"
    19. MySQL_Host="127.0.0.1"
    20. Mastet_IP="192.168.100.101" #修改IP为Master IP
    21. #ChangMaster="192.168.100.103"
    22. #ChangMasterSlave="192.168.100.101"
    23. Storage=`docker ps|grep esl_storage_1|wc -l`
    24. Tracker=`docker ps|grep esl_tracker_1|wc -l`
    25. echo "---------------------------函数区域-----------------------------"
    26. Install_Mysql() {
    27. Mysql_Version=`mysql -V`
    28. if [ $? -ne 0 ];then
    29. printf "No MySQL command\n"
    30. yum -y install mysql >/dev/null
    31. else
    32. printf "There are MySQL commands\n"
    33. fi
    34. }
    35. Check_sshpass() {
    36. Command_sshpass=`sshpass -V`
    37. if [[ ! $? -eq 0 ]]; then
    38. yum -y install sshpass
    39. else
    40. echo "sshpass命令已安装"
    41. fi
    42. }
    43. echo "---------------------MySQL双主配置-----------------------------"
    44. Configure_Mysql() {
    45. if [[ ! $(docker ps |grep esl_mysql_1|wc -l) -ne 1 ]]; then
    46. echo "----------------------------------------------"
    47. echo "- Modify MySQL master database configuration -"
    48. echo "----------------------------------------------"
    49. eval sed -i '5i\server-id=1' $MySQL_Confugure
    50. eval sed -i '6i\log-bin=mysql-bin' $MySQL_Confugure
    51. eval sed -i '7i\binlog-do-db=demo' $MySQL_Confugure
    52. eval sed -i '8i\enforce-gtid-consistency' $MySQL_Confugure
    53. #Modify main library UUID
    54. eval sed -i 's#$Auto#24f3#g' /usr/local/esl/mysql/auto.cnf
    55. if [ "$?" == "0" ]; then
    56. printf "Master 创建主从同步用户\n"
    57. read -p "请输入Slave 主机IP: " Slave_IP
    58. mysql -u$MySQL_User -p$MySQL_PASSWD -h $MySQL_Host -e "grant replication slave on *.* to 'repl'@'$Slave_IP' identified by 'Zkong_1234';"
    59. mysql -u$MySQL_User -p$MySQL_PASSWD -h $MySQL_Host -e "flush privileges;"
    60. echo "$Slave_IP"
    61. docker restart esl_mysql_1
    62. echo "开始随机等待 1-10 秒..."
    63. sleep $[ ( $RANDOM % 10 ) + 1 ]
    64. echo "等待后继续"
    65. echo "---------------------------------------------"
    66. echo "- Slave library create synchronization user -"
    67. echo "---------------------------------------------"
    68. printf "连接到Slave机器..."
    69. read -p "请输入 Slave 主机IP: " Host_IP
    70. #Mastet_IP="192.168.100.101"
    71. read -p "请输入Slave 服务器密码:" command_pass
    72. sshpass -p$command_pass ssh root@$Host_IP "yum -y install mysql"
    73. ssh -tt root@$Host_IP << remotessh
    74. #Modify MySQL master database configuration
    75. eval sed -i '5i\server-id=2' $MySQL_Confugure
    76. eval sed -i '6i\log-bin=mysql-bin' $MySQL_Confugure
    77. eval sed -i '7i\binlog-do-db=demo' $MySQL_Confugure
    78. eval sed -i '8i\enforce-gtid-consistency' $MySQL_Confugure
    79. #Slave library create synchronization user
    80. mysql -u$MySQL_User -p$MySQL_PASSWD -h $MySQL_Host -e "grant replication slave on *.* to 'repl'@'$Mastet_IP' identified by 'Zkong_1234';"
    81. mysql -u$MySQL_User -p$MySQL_PASSWD -h $MySQL_Host -e "flush privileges;"
    82. { docker restart esl_mysql_1;exit; }
    83. remotessh
    84. else
    85. exit -1
    86. fi
    87. else
    88. { printf "MySQL No Running!\n";exit -1;}
    89. fi
    90. }
    91. Command() {
    92. read -p "请输入Master IP:" ChangMaster
    93. read -p "请输入Slave IP:" ChangMasterSlave
    94. Master_File=`mysql -u$MySQL_User -p$MySQL_PASSWD -h$MySQL_Host -e "show master status;"|awk '/mysql-bin/{print $1}'`
    95. Master_Position=`mysql -u$MySQL_User -p$MySQL_PASSWD -h$MySQL_Host -e "show master status;"|awk '/mysql-bin/{print $2}'`
    96. echo Mastart:$Master_File Master_Position:$Master_Position
    97. Slave_File=`mysql -u$MySQL_User -p$MySQL_PASSWD -h$ChangMaster -e "show master status;"|awk '/mysql-bin/{print $1}'`
    98. Slave_Position=`mysql -u$MySQL_User -p$MySQL_PASSWD -h$ChangMaster -e "show master status;"|awk '/mysql-bin/{print $2}'`
    99. echo Slave_file:$Slave_File Slave_Position:$Slave_Position
    100. Master_command=`mysql -u$MySQL_User -p$MySQL_PASSWD -h$ChangMasterSlave -e "change master to master_host='$ChangMaster',master_port=3306,master_user='repl',master_password='Zkong_1234',master_log_file='$Slave_File',master_log_pos=$Slave_Position;"`
    101. Master_command_start=`mysql -u$MySQL_User -p$MySQL_PASSWD -h$ChangMasterSlave -e "start slave;"`
    102. Slave_command=`mysql -u$MySQL_User -p$MySQL_PASSWD -h$ChangMaster -e "change master to master_host='$ChangMasterSlave',master_port=3306,master_user='repl',master_password='Zkong_1234',master_log_file='$Master_File',master_log_pos=$Master_Position;"`
    103. slave_command_start=`mysql -u$MySQL_User -p$MySQL_PASSWD -h$ChangMaster -e "start slave;"`
    104. }
    105. Check_Master() {
    106. Slave_IO_Running=`mysql -u$MySQL_User -p$MySQL_PASSWD -h$MySQL_Host -e 'show slave status\G'|egrep 'Slave_IO_Running'|awk '{print $2}'`
    107. Slave_SQL_Running=`mysql -u$MySQL_User -p$MySQL_PASSWD -h$MySQL_Host -e 'show slave status\G'|egrep 'Slave_SQL_Running'|awk 'NR==1{print $2}'`
    108. #检查MySQL 主库状态
    109. if [ "$Slave_IO_Running" = "Yes" ] && [ "$Slave_SQL_Running" = "Yes" ]; then
    110. (
    111. set -x
    112. printf "Master and Slave Status YES."
    113. )
    114. else
    115. (
    116. set -x
    117. printf "MySQL Master and Slave ERROR!"
    118. )
    119. fi
    120. }
    121. echo "------------------------------EMQX-Master 配置-------------------------------"
    122. EMQX_Configure_Master(){
    123. emqx_config="/usr/local/esl/emqtt/etc/emqx.conf"
    124. read -p "Please enter the emqx node1 IP:" Node_name1
    125. read -p "Please enter the emqx node2 IP:" Node_name2
    126. sed 's#cluster.discovery = manual#cluster.discovery = static#g' $emqx_config -i
    127. sed "s#node.name = emqx@127.0.0.1#node.name = emqx1@$Node_name1#g" $emqx_config -i
    128. sed "52 i\cluster.static.seeds= emqx1@$Node_name1,emqx2@$Node_name2" $emqx_config -i
    129. echo "--------------------------------------"
    130. echo "- 正在重启$Node_name1 emqtt... -"
    131. echo "--------------------------------------"
    132. docker restart esl_emqtt_1
    133. }
    134. echo "-------------------------EMQX-Slave 配置--------------------------------"
    135. EMQX_Configure_Slave(){
    136. emqx_config="/usr/local/esl/emqtt/etc/emqx.conf"
    137. read -p "Please enter the emqx node2 IP:" Node_name2
    138. read -p "请输入EMQX node2 服务器密码: " EMQX_Password
    139. read -p "Please enter the emqx node1 IP:" Node_name1
    140. sshpass -p$EMQX_Password ssh root@$Node_name2 "sed 's#cluster.discovery = manual#cluster.discovery = static#g' $emqx_config -i"
    141. sshpass -p$EMQX_Password ssh root@$Node_name2 "sed 's#node.name = emqx@127.0.0.1#node.name = emqx2@$Node_name2#g' $emqx_config -i"
    142. sshpass -p$EMQX_Password ssh root@$Node_name2 "sed '52 i\cluster.static.seeds= emqx1@$Node_name2,emqx2@$Node_name1' $emqx_config -i"
    143. echo "--------------------------------------"
    144. echo "- 正在重启$Node_name1 emqtt... -"
    145. echo "--------------------------------------"
    146. docker restart esl_emqtt_1
    147. printf "开始随机等待1-10秒..."
    148. sleep $[ ( $RANDOM % 10 ) + 1 ]
    149. echo "等待后执行..."
    150. echo "-------------------------------------"
    151. echo "- EMQX集群配置 -"
    152. echo "-------------------------------------"
    153. ssh -tt root@$Node_name2 << EOF
    154. docker exec esl_emqtt_1 bash
    155. { cd /usr/local/emqx/bin >/dev/null 2>&1;./emqx_ctl cluster join emqx1@$Node_name1 >/dev/null 2>&1;exit -1;docker restart esl_emqtt_1; }
    156. echo "-----------------------------------------"
    157. echo "- 检查EMQX 集群状态 -"
    158. echo "-----------------------------------------"
    159. exit
    160. EOF
    161. exit
    162. }
    163. echo "---------------------------------------------FastDFS集群配置区域------------------------------------"
    164. Fastdfs_Master(){
    165. if [ "$Tracker" = "1" ] && [ "$Storage" = "1" ]; then
    166. (
    167. set -x
    168. printf "Running."
    169. { docker rm -f esl_storage_1;docker rm -f esl_tracker_1; }
    170. )
    171. else
    172. (
    173. set -x
    174. echo "The storage tacker container does not exist"
    175. )
    176. fi
    177. }
    178. Fastdfs_Slave(){
    179. read -p "请输入Slave IP:" fast_IP
    180. read -p "请输入Slave 服务器密码:" PassWord
    181. sshpass -p$PassWord ssh root@$fast_IP 'docker rm -f esl_tracker_1 && docker rm -f esl_storage_1'
    182. }
    183. Fastdfs_cluster(){
    184. Tracker_Path="/usr/local/esl/fastdfs/tracker/"
    185. Storage_Path="/usr/local/esl/fastdfs/storage/"
    186. Trakcer_Base_Path="/export/fastdfs/tracker"
    187. Storage_Base_Path="/export/fastdfs/storage"
    188. if [ ! -d "$Tracker_Path" ] && [ ! -d "$Storage_Path" ] ;then
    189. mkdir -p $Tracker_Path
    190. mkdir -p $Storage_Path
    191. else
    192. echo "目录已存在"
    193. fi
    194. read -p "请输入Tracker Server01 IP:" Tracker_Server01
    195. read -p "请输入Tracker Server02 IP:" Tracker_Server02
    196. docker run -dti -e TZ="Asia/Shanghai" --network=host --name esl_tracker_1 --restart=always -v $Tracker_Path:/export/fastdfs/tracker -e TRACKER_BASE_PATH=$Trakcer_Base_Path -e TRACKER_PORT=8300 gzlj2018/fastdfs:5.11 sh /usr/local/src/tracker.sh
    197. docker run -dti -e TZ="Asia/Shanghai" --network=host --name esl_storage_1 --restart=always -v $Storage_Path:/export/fastdfs/storage -e STORAGE_PORT=8400 -e STORAGE_BASE_PATH=$Storage_Base_Path -e STORAGE_PATH0=$Storage_Base_Path -e TRACKER_SERVER=$Tracker_Server01:8300,$Tracker_Server02:8300 -e GROUP_COUNT=1 -e HTTP_SERVER_PORT=8410 -e GROUP_NAME=group1 gzlj2018/fastdfs:5.11 sh /usr/local/src/storage.sh
    198. read -p "请输出Slave IP:" Create_dir
    199. read -p "请输入Slave 服务器密码: " Slave_Password
    200. sshpass -p$Slave_Password ssh root@$Create_dir "[ -d $Storage_Path ] && echo "目录存在" || echo "目录不存在" && mkdir -p $Storage_Path"
    201. sshpass -p$Slave_Password ssh root@$Create_dir "[ -d $Tracker_Path ] && echo "目录存在" || echo "目录不存在" && mkdir -p $Tracker_Path"
    202. sshpass -p$Slave_Password ssh root@$Create_dir "docker run -dti -e TZ="Asia/Shanghai" --network=host --name esl_tracker_1 --restart=always -v $Tracker_Path:/export/fastdfs/tracker -e TRACKER_BASE_PATH=$Trakcer_Base_Path -e TRACKER_PORT=8300 gzlj2018/fastdfs:5.11 sh /usr/local/src/tracker.sh"
    203. sshpass -p$Slave_Password ssh root@$fast_IP "docker run -dti -e TZ="Asia/Shanghai" --network=host --name esl_storage_1 --restart=always -v $Storage_Path:/export/fastdfs/storage -e STORAGE_PORT=8400 -e STORAGE_BASE_PATH=$Storage_Base_Path -e STORAGE_PATH0=$Storage_Base_Path -e TRACKER_SERVER=$Tracker_Server02:8300,$Tracker_Server01:8300 -e GROUP_COUNT=1 -e HTTP_SERVER_PORT=8410 -e GROUP_NAME=group1 gzlj2018/fastdfs:5.11 sh /usr/local/src/storage.sh"
    204. if [ $? = "0" ];then
    205. echo "Fastdfs slave create tracker Server"
    206. exit 1
    207. fi
    208. }
    209. echo "--------------------------------------使用帮助区域----------------------------------------"
    210. help(){
    211. # Print help information using less utility:
    212. less << _EOF_
    213. GNU bash,版本 4.2.46(2)-release-(x86_64-redhat-linux-gnu)
    214. Press "q" to exit this Help page.
    215. Note: run test environment CentOS 7.6
    216. Writing time September 19, 2021
    217. Script version v1.0
    218. Functions include MySQL dual master environment, emqx cluster environment and fastdfs cluster environment
    219. Usage:
    220. sh [file]
    221. input:
    222. -m, --mysql 安装MySQL双主环境
    223. -e, --emqx 安装EMQX集群环境
    224. -f, --fastdfs 安装StorageTracker集群环境
    225. -h, --help 使用帮助
    226. 请输入 sh file scripts 以获得关于 Shell 选项的更多操作信息
    227. _EOF_
    228. }
    229. echo "----------------------------------------执行函数区域------------------------------"
    230. Read_Input() {
    231. cat <<EOF
    232. echo "-------------------------------------------------"
    233. echo "- h | --help 安装帮助 -"
    234. echo "- m | --mysql 安装MySQL 双主环境 -"
    235. echo "- e | --emqx 安装EMQX 集群环境 -"
    236. echo "- f | --fastdfs 安装EMQX 集群环境 -"
    237. echo "-------------------------------------------------"
    238. EOF
    239. read -p "请选择安装服务 :" Server
    240. }
    241. Show_Status () {
    242. case $Server in
    243. m | --mysql)
    244. Check_sshpass
    245. echo "安装MySQL服务..."
    246. set -x
    247. Install_Mysql
    248. Configure_Mysql
    249. Command
    250. printf "开始随机等待1-10秒..."
    251. sleep $[ ( $RANDOM % 10 ) + 1 ]
    252. echo "等待后执行检查双主状态..."
    253. Check_Master
    254. ;;
    255. e | --emqx)
    256. Check_sshpass
    257. echo "配置emqx 集群"
    258. set -x
    259. EMQX_Configure_Master
    260. printf "开始随机等待1-10秒..."
    261. sleep $[ ( $RANDOM % 10 ) + 1 ]
    262. echo "等待后执行..."
    263. EMQX_Configure_Slave
    264. ;;
    265. f | --fastdfs)
    266. Fastdfs_Master
    267. Fastdfs_Slave
    268. Fastdfs_cluster
    269. ;;
    270. h | --help)
    271. Check_sshpass
    272. echo "help帮助手册"
    273. help
    274. ;;
    275. *)
    276. echo "参考安装手册"
    277. exit 1
    278. ;;
    279. esac
    280. }
    281. #执行函数
    282. main(){
    283. Read_Input
    284. Show_Status
    285. }
    286. main