ubuntu keepalived+mysql+tomcat+redis** 高可用部署**
环境
服务器 IP | 端口 | 角色 | 说明 |
---|---|---|---|
192.169.3.211 | 6379 | Redis | 主redis |
192.169.3.211 | 3306 | Mysql | 从节点1 |
192.169.3.211 | 8080、8899 | Tomcat | 从节点2 |
192.169.3.208 | 6379 | Redis | 哨兵1 |
192.169.3.208 | 3306 | Mysql | 哨兵2 |
192.169.3.208 | 8080、8899 | Tomcat | 哨兵3 |
虚拟服务器 IP | 端口 | 角色 | 说明 |
---|---|---|---|
192.169.3.179 | 6379 | Redis | Redis VIP |
192.169.3.181 | 3306 | Mysql | Mysql VIP |
192.169.3.210 | 8080、8899 | Tomcat | Tomcat VIP |
架构图
环境
Ubuntu:22.04
Java:jdk1.8.0\_381
Tomcat:apache-tomcat-9.0.78
Keepalived :Keepalivedv2.2.8
Redis:redis-7.0.1
Mysql:mysql-8.3.33
准备工作
- 在/home文件夹下面新增yuno文件夹,/home/yuno
- 将JDK、Tomcat、Redis、Mysql、Keepalived安装文件包上传到两台服务器/home/yuno
Tomcat+JDK配置
-
创建并设置Tomcat用户
groupadd tomcat useradd -s /bin/false -g tomcat -d /opt/tomcat tomcat
-
解压缩、移动文件
mkdir /opt/tomcat tar xzvf apache-tomcat-9.0.78.tar.gz -C /opt/tomcat --strip-components=1 tar -zxvf jdk-8u381-linux-x64.tar.gz mv jdk1.8.0\_381/ /usr/local/
-
设置JAVA_HOME环境变量
vim /etc/profile
输入以下内容
export JAVA\_HOME=/usr/local/jdk1.8.0\_381 export JRE\_HOME=${JAVA\_HOME}/jre export CLASSPATH=.:${JAVA\_HOME}/lib:${JRE\_HOME}/lib export PATH=${JAVA\_HOME}/bin:$PATH
-
使设置生效
source /etc/profile
-
测试
java -version
-
更新Tomcat文件权限
cd /opt/tomcat sudo chgrp -R tomcat /opt/tomcat sudo chmod -R g+r conf sudo chmod g+x conf sudo chown -R tomcat webapps/ work/ temp/ logs sudo chown -R tomcat webapps/ work/ temp/ logs mkdir /home/tomcat cd /home/tomcat mkdir .java mkdir .java/.userPrefs mkdir .java/.systemPrefs chown tomcat:tomcat -R /home/tomcat/.java/.systemPrefs chown tomcat:tomcat -R /home/tomcat/.java
-
Tomcat环境变量设置
cd /usr/local/apache-tomcat-9.0.78/bin/ touch setenv.sh vim setenv.sh
输入以下内容
# 设置JAVA\_HOME export JAVA\_HOME=/usr/local/jdk1.8.0\_381 export JRE\_HOME=$JAVA\_HOME/jre export CLASSPATH=$JAVA\_HOME/lib:$JRE\_HOME/lib:$CLASSPATH export PATH=$JAVA\_HOME/bin:$JRE\_HOME/bin:$PATH export CATALINA\_HOME=/usr/local/apache-tomcat-9.0.78 export CATALINA\_BASE=/usr/local/apache-tomcat-9.0.78 # 设置Tomcat的PID文件 CATALINA\_PID="$CATALINA\_BASE/tomcat.pid" # 添加JVM选项 JAVA\_OPTS="-server -XX:PermSize=256M -XX:MaxPermSize=1024m -Xms512M -Xmx1024M -XX:MaxNewSize=256m"
-
设置Tomcat自启动
vim /etc/systemd/system/tomcat.service
输入以下内容
[Unit] Description=Apache Tomcat Web Application Container After=network.target [Service] Type=forking Environment=JAVA\_HOME=/usr/local/jdk1.8.0\_381 Environment=CATALINA\_PID=/opt/tomcat/temp/tomcat.pid Environment=CATALINA\_HOME=/opt/tomcat Environment=CATALINA\_BASE=/opt/tomcat Environment='CATALINA\_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC' Environment='JAVA\_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom -Djava.util.prefs.systemRoot=/home/tomcat/.java -Djava.util.prefs.userRoot=/home/tomcat/.java/.userPrefs' ExecStart=/opt/tomcat/bin/startup.sh ExecStop=/opt/tomcat/bin/shutdown.sh User=tomcat Group=tomcat UMask=0007 RestartSec=10 Restart=always [Install] WantedBy=multi-user.target
-
测试
systemctl daemon-reload systemctl start tomcat.service systemctl status tomcat.service
Mysql 安装和双主配置
-
安装并测试
sudo apt update sudo apt install mysql-server sudo systemctl status mysql
-
新增copying和root账号
sudo mysql -u root -p CREATE USER 'copying'@'%' IDENTIFIED WITH mysql\_native\_password BY 'abc.123'; CREATE USER 'root'@'%' IDENTIFIED WITH mysql\_native\_password BY 'abc.123'; alter user 'copying'@'localhost' identified with mysql\_native\_password by 'abc.123'; alter user 'copying'@'%' identified with mysql\_native\_password by 'abc.123'; alter user 'root'@'localhost' identified with mysql\_native\_password by 'abc.123'; alter user 'root'@'%' identified with mysql\_native\_password by 'abc.123'; GRANT ALL PRIVILEGES ON \*.\* TO 'copying'@'localhost'; GRANT ALL PRIVILEGES ON \*.\* TO 'copying'@'%'; GRANT ALL PRIVILEGES ON \*.\* TO copying@'%' IDENTIFIED BY 'abc.123' with grant option ; flush privileges;
-
开机自启动
systemctl enable mysql
测试
systemctl is-enable mysql
Mysql双主配置
-
Server 192.168.3.211配置:/etc/mysql/my.cnf
[mysqld] user = mysql bind-address = 0.0.0.0 mysqlx-bind-address = 127.0.0.1 key\_buffer\_size = 16M myisam-recover-options = BACKUP log\_error = /var/log/mysql/error.log server-id = 1 log\_bin = /var/log/mysql/mysql-bin.log max\_binlog\_size = 100M binlog\_do\_db = yzy binlog\_ignore\_db = mysql binlog\_format = MIXED log-slave-updates auto-increment-offset = 1 auto-increment-increment = 2
-
Server 192.168.3.208配置:/etc/mysql/my.cnf
[mysqld] user = mysql bind-address = 0.0.0.0 mysqlx-bind-address = 127.0.0.1 key\_buffer\_size = 16M myisam-recover-options = BACKUP log\_error = /var/log/mysql/error.log server-id = 2 log\_bin = /var/log/mysql/mysql-bin.log max\_binlog\_size = 100M binlog\_do\_db = yzy binlog\_ignore\_db = mysql binlog\_format = MIXED log-slave-updates auto-increment-offset = 2 auto-increment-increment = 2
-
重启Mysql
sudo service mysql restart
-
设置主备
Server 192.168.3.208执行命令行:
CHANGE MASTER TO MASTER\_HOST='192.168.3.211',master\_port=3306,master\_user='copying',master\_password='abc.123',MASTER\_LOG\_FILE = 'mysql-bin.000008',MASTER\_LOG\_POS = 157;
Server 192.168.3.211执行命令行:
CHANGE MASTER TO MASTER\_HOST='192.168.3.208',master\_port=3306,master\_user='copying',master\_password='abc.123',MASTER\_LOG\_FILE = 'mysql-bin.000003',MASTER\_LOG\_POS = 157;
-
开启slave
mysql\> start slave;
-
查看同步状态
mysql\> show slave status\G;
分别查看Server1和Server2状态,若Slave_IO_Running和Slave_SQL_Running是Yes则主主复制成功
-
重置操作
mysql\> stop slave; mysql\> reset master; mysql\> CHANGE MASTER... mysql\> start slave;
Redis安装
-
安装依赖包
apt-get install gcc gpg python3 make automake libssl-dev
-
解压缩和移动文件夹
tar -zxvf redis-7.0.1.tar.gz mv ./redis-7.0.1 /usr/local/ cd /usr/local/redis-7.0.1
-
编译和安装
make cd src make install
-
检查运行状态
systemctl status redis
-
设置开机自启动
systemctl enable redis
Redis主从配置
-
Server 192.168.3.211配置
daemonize yes requirepass abc.123 bind 0.0.0.0 slave-serve-stale-data yes slave-read-only no
-
Server 192.168.3.208配置
slaveof 192.168.3.211 6379 requirepass abc.123 masterauth abc.123 slave-serve-stale-data yes slave-read-only no
-
测试是否成功
在192.168.3.211中执行
cd /usr/local/redis/ redis-cli -a 123456 set name sunwu get name keys \*
192.168. 3.208 slave 中
如果可以get到name的值,就证明成功了。
cd /usr/local/redis/ redis-cli -a 123456 get name keys \*
安装 Keepalived
-
安装
tar -zxvf keepalived-2.2.8.tar.gz ./configure --prefix=/usr/local/keepalived mkdir /etc/keepalived ln -s keepalived/sbin/keepalived /usr/sbin/ cp keepalived/etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf cp keepalived/etc/sysconfig/keepalived /etc/sysconfig/
-
检查运行状态
systemctl status keepalived
-
配置开机自启
systemctl enable keepalived
Keepalived 配置高可用
-
修改Server192.168.3.211 master keepalived.conf 配置文件
cd /etc/keepalived/ vim keepalived.conf
内容如下
! Configuration File for keepalived global_defs { router_id 214 script_user root } vrrp_script chk_redis { script "/etc/keepalived/scripts/redis_check.sh" interval 2 } vrrp_script chk_mysql { script "/etc/keepalived/scripts/mysql_check.sh" interval 2 } vrrp_script chk_http_port { script "/opt/tomcat/tomcat.pid" interval 2 } vrrp_instance VI_1 { state MASTER interface ens160 virtual_router_id 55 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_redis } virtual_ipaddress { 192.168.3.179 #VIP地址 } notify_master /etc/keepalived/scripts/redis_master.sh notify_backup /etc/keepalived/scripts/redis_backup.sh notify_fault /etc/keepalived/scripts/redis_fault.sh notify_stop /etc/keepalived/scripts/redis_stop.sh } vrrp_instance VI_2 { state BACKUP interface ens160 virtual_router_id 60 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_mysql } virtual_ipaddress { 192.168.3.181 #VIP } } vrrp_instance VI_3 { state BACKUP interface ens160 virtual_router_id 52 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_http_port } virtual_ipaddress { 192.168.3.210 } }
-
修改Server192.168.3.208 slave keepalived.conf 配置文件
cd /etc/keepalived/ vim keepalived.conf
conf 内容如下
! Configuration File for keepalived global_defs { router_id 214 script_user root } vrrp_script chk_redis { script "/etc/keepalived/scripts/redis_check.sh" interval 2 } vrrp_script chk_mysql { script "/etc/keepalived/scripts/mysql_check.sh" interval 2 } vrrp_script chk_http_port { script "/opt/tomcat/tomcat.pid" interval 2 } vrrp_instance VI_1 { state MASTER interface ens160 virtual_router_id 55 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_redis } virtual_ipaddress { 192.168.3.179 #VIP地址 } notify_master /etc/keepalived/scripts/redis_master.sh notify_backup /etc/keepalived/scripts/redis_backup.sh notify_fault /etc/keepalived/scripts/redis_fault.sh notify_stop /etc/keepalived/scripts/redis_stop.sh } vrrp_instance VI_2 { state BACKUP interface ens160 virtual_router_id 60 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_mysql } virtual_ipaddress { 192.168.3.181 #VIP } } vrrp_instance VI_3 { state BACKUP interface ens160 virtual_router_id 52 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_http_port } virtual_ipaddress { 192.168.3.210 } }
-
添加Server192.168.3.211 master脚本文件
-
添加Server192.168.3.208 slave脚本文件
常见问题
-
Failed to start keepalived.service: Unit keepalived.service is masked
systemctl unmask keepalived
-
MySQL执行脚本或连接访问报Access denied for user ‘root’@‘%’ to database ‘xxx’
UPDATE mysql.user SET Grant\_priv='Y', Super\_priv='Y' WHERE User='root'; flush privileges; quit; systemctl restart mysql
-
Keepalived安装时:OpenSSL is not properly installed on your system. !!!
apt install libssl-dev
-
ssh 开root访问
vim /etc/ssh/sshd\_config
找到PermitRootLogin without-password 修改为PermitRootLogin yes
service ssh restart
-
keepalived Default-Start contains no runlevels, aborting
https://www.cnblogs.com/hellojesson/p/10731620.html