1、脚本文件运行出错:syntax error: unexpected end of file
1、查看脚本文件格式
vim check_pg_ha.sh打开文件,执行 :set ff,回车,左下角有 fileformat=dos,则为dos格式,必须转换为unix格式才能使用。
2、解决方法
vim check_pg_ha.sh打开文件,执行:set ff=unix 设置文件为unix,然后执行:wq,保存成unix格式 。
3、运行shell脚本
增加脚本的可执行权限:chmod +x test.sh
运行脚本文件:./test.sh
4、以调试模式运行
bash -x test.sh
2、check_pg_ha.sh
#! /bin/bash 检测数据库pg-0状态
currTime=`date +"%Y-%m-%d %H:%M:%S"`
exist=`docker inspect --format '{{.State.Running}}' pg-0`
if [ "${exist}" != "true" ]; then
service keepalived stop
# docker start pg-0
echo "***${currTime},检测到容器pg-0运行不正常,keepalived主备切换***" >> /root/ha/ha.log
exit 1
fi
#! /bin/bash 检测haproxy状态
A=`ps -C haproxy --no-header |wc -l`
if [ $A -eq 0 ]; then
service keepalived stop
docker stop pg-0
echo "***${currTime},检测到haproxy运行不正常,keepalived和pg主备切换***" >> /root/ha/ha.log
exit 1
fi
exit 0
3、haproxy安装
1. 安装
yum install -y haproxy rsyslog
2. 编辑配置文件
vim /etc/haproxy/haproxy.cfg
3.日志配置
A、在 /etc/rsyslog.conf 文件追加以下内容:
local2.* /var/log/haproxy.log
B、并将以下配置项的注释去掉:
$ModLoad imudp
$UDPServerRun 514
C、新建 /etc/rsyslog.d/haproxy.conf 文件,输入以下内容:
local2.* /var/log/haproxy.log
4.启动
service rsyslog start
service haproxy start
5.查看服务状态启动结果
查看启动过程和结果:systemctl status haproxy.service -l
查看全部服务状态:systemctl
6.启动不成功原因
ssl没提供证书
80端口被nginx占用
4、keepalived的抢占与非抢占
实际生产中是,当 原先的master恢复后,状态变为backup,不接管服务,这是非抢占模式。
接下来分4种情况说明
1)俩台都为master时,比如server1的优先级大于server2,keepalived启动后server1获得master,server2自动降级为backup。此时server1宕机的话,server2接替 服务,当server1恢复后,server1又变为master,重新接管服务,server2变为backup。属于抢占式。
2)server1为master,server2位backup,且master优先级大于backup。keepalived启动后server1获得master,server2为backup。当server1宕机后, server2接管服务。当server1恢复后,server1重新接管服务变为master,而server2变为backup。属于抢占式
3)server1为master,server2位backup,且master优先级低于backup。keepalived启动后server2获得master,server1为backup。当server2宕机后, server1接管服务。此时server2恢复后抢占服务,获得master,server1降级将为backup。属于抢占式
以上3种,只要级别高就会获取master,与state状态是无关的
4)server1和server2都为backup。我们要注意启动server服务的启动顺序,先启动的升级为master,与优先级无关。。且配置nopreempt项
比如server1获得master权限,server2为backup。此时server1宕机后,server2接管服务升级为master。当server1恢复后权限将为backup,不会争抢 server2的master权限,server2将会继续master权限。属于非抢占式
重点:第4种非抢占式俩节点state必须为bakcup,且必须配置nopreempt
注意:这样配置后,我们要注意启动服务的顺序,优先启动的获取master权限,与优先级没有关系了
总结:抢占模式即MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来。非抢占模式即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP
在抢占模式中,在Keepalived集群中,其实并没有严格意义上的主、备节点,虽然可以在Keepalived配置文件中设置“state”选项为“MASTER”状态,但是这并不意味着此节点一直就是Master角色。控制节点角色的是Keepalived配置文件中的“priority”值,但并它并不控制所有节点的角色,另一个能改变节点角色的是在vrrp_script模块中设置的“weight”值,这两个选项对应的都是一个整数值,其中“weight”值可以是个负整数,一个节点在集群中的角色就是通过这两个值的大小决定的。
1.“weight”值为正数时
在vrrp_script中指定的脚本如果检测成功,那么Master节点的权值将是“weight值与”priority“值之和,如果脚本检测失败,那么Master节点的权值保持为“priority”值,因此切换策略为:
Master节点“vrrp_script”脚本检测失败时,如果Master节点“priority”值小于Backup节点“weight值与”priority“值之和,将发生主、备切换。
Master节点“vrrp_script”脚本检测成功时,如果Master节点“weight”值与“priority”值之和大于Backup节点“weight”值与“priority”值之和,主节点依然为主节点,不发生切换。
5、centos只安装postgresql客户端psql
A、找到官网链接后安装
yum install https://download.postgresql.org/pub/repos/yum/12/redhat/rhel-7.12-x86_64/postgresql12-libs-12.3-5PGDG.rhel7.x86_64.rpm
B、复制代码二直接安装
先安装yum源
#Install the repository RPM:
yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
#再安装客户端
yum install postgresql12
C、复制代码安装后:
#psql -V
psql (PostgreSQL) 12.3
6、设置pg密码环境变量,在使用脚本pgql访问pg数据库时需要输入密码,设置后自动输入
#linux系统 例如centos7[root@pg-1 pg]# vim /etc/profile
[root@pg-1 pg]# export PGPASSWORD=Emxxxxxxx
[root@pg-1 pg]# source /etc/profile
临时性生效,bash关闭失效
export PGPASSWORD=Emxxxxxxx
#windows系统
set PGPASSWORD=Emxxxxxxx
bash调试命令:bash -x test.sh
7、Keepalived 的配置部署
1.安装
yum install -y ipvsadm keepalived rsyslog
2.修改配置文件 /etc/keepalived/keepalived.conf
3.Haproxy 进程状态检查脚本 chk_haproxy.sh,需要把检查脚本 chk_haproxy.sh 上传到每台机器的 /etc/keepalived 目录下。
4. 启动
service keepalived start
5. 查看服务状态
systemctl status keepalived.service -l
8、check.sh文件
Check_Nginx_Server()
{
http_status_code=$(curl -m 5 -s -i -w %{http_code} -o/index.html localhost)
if [ $http_status_code -ne 200 ];then
echo "***${currTime},检测到容器pg-0不运行,keepalived主备切换***"
fi
}
Check_Nginx_Server
Check_pg_Server()
{
currTime=`date +"%Y-%m-%d %H:%M:%S"`
result=`psql -X -A -U postgres -h 127.0.0.1 -d ttlock -p 5432 -t -c 'UPDATE public.check SET timestr=1 WHERE id=1'`
if [ "${result}" != "UPDATE 1" ]; then
echo "***${currTime},检测到容器pg-0不运行,keepalived主备切换***" >> keepalived.log
fi
}
Check_pg_Server
ip addr | awk '/^[0-9]+: / {}; /inet.*global/ {print gensub(/(.*)\/(.*)/, "\\1", "g", $2)}'