因为近期项目中需要用到负载均衡,所以查阅了比较多的资料,但是大部分文档都差不多的,说的都是相同的内容,所以导致出错都是相同的位置,相同的原因。所以这里将这些都整理一下,基础介绍就不写了,直接上方案。“前人种树,后人乘凉”,成长的过程中,总需要一些养分的~
一、负载均衡中实现代码同步rsync
1.准备两台已经配置好环境的服务器,A(源服务器,假设服务器IP:192.0.0.1),B(目标服务器,即将数据拷贝至此服务器中),后面文档中都用AB代替
2.将两台服务器都安装rsync组件
yum install rsync
3.安装完之后,查看rsync版本信息,如果正常查看则表示安装成功
rsync --version
vi /etc/rsyncd.conf
uid = nobody #指定服务器B的用户id和用户组,nobody表示所有人 gid = nobody #指定服务器B的用户id和用户组,nobody表示所有人 max connections = 4 #允许最大连接数 就是有多少台服务器链接,根据实际情况调整 read only = true #只读模式 # hosts allow = 192.1.1.1 # B服务器IP,即允许连接的服务器公网IP,多个用逗号隔开 hosts allow = * #现在是允许所有的服务器都能连 transfer logging = true log format = %h %o %f %l %b log file = /var/log/rsyncd.log #日志文件 slp refresh = 300 log file = /var/log/rsyncd.log pid file = /var/run/rsyncd.pid #进程文件位置 lock file = /var/run/rsyncd.lock #定义需要监控备份的项目名称,自定义,后面会用到 [wwwtest] path = /www/web/test #服务器B需要备份的当前服务器的文件夹 read only = false auth users = root #允许的用户 secrets file = /etc/rsyncd.password #填写用户密码的文件,后面会用到,可自定义
5.编辑密码文件,设置用户密码信息,上一步填写的密码文件路径
vi /etc/rsyncd.password
# 格式如下: # 用户名:密码 root:123456
6.设置密码文件权限,把文件设置为600权限,只能是600权限
chmod -R 600 /etc/rsyncd.password
7.配置开机启动,在其中添加内容【如果是centos系统,注意设置启动文件执行权限,否则无法生效】
vi /etc/rc.local
/usr/bin/rsync --daemon --config=/ect/rsyncd.conf
查看并修改系统启动文件权限,因为/etc/rc.local文件是软连接,所以即使是777权限也没有效果,一定要设置如下文件
ll /etc/rc.d/rc.local
chmod 755 /etc/rc.d/rc.local
8.配置B服务器,新增密码文件(这里我定义的相同路径的文件,也可以自己修改,但是后面执行同步文件指令的时候,需要保持一致),然后填写A服务器登录用户的密码,即第5步设置的密码,要保持一致,否则后续会报错
vi /etc/rsyncd.password
# /etc/rsyncd.password文件内容 123456
9.配置服务器B的开机启动脚本,如果无权限,需要和第7步中一样设置文件权限
vi /etc/rc.local
/usr/bin/rsync --daemon
以上就已经将服务器AB配置完毕,以下是执行脚本,用来同步文件
1.在服务器B执行命令,进行文件首次文件同步
# rsync -vzrtopg --progress 服务器A的登录用户名@服务器A的公网IP::服务器A的rsyncd.conf文件中配置的项目名称 服务器B保存备份路径 --password-file=服务器B密码文件路径 rsync -vzrtopg --progress root@192.0.0.1::wwwtest /www/web/test --password-file=/etc/rsyncd.password
2.在服务器B添加同步文件脚本
vi /root/rsyncd.sh
#!/bin/bash step=1 for (( i = 0; i < 60; i=(i+step) )); do $(rsync -avzP --delete root@192.0.0.1::wwwtest /www/web/test --password-file=/etc/rsyncd.password) sleep $step done exit 0
添加以上内容需要注意,$(rsync -avzP --delete root@192.0.0.1::wwwtest /www/web/test --password-file=/etc/rsyncd.password)只能为一行,直接复制,可能会出现多行,否则会导致无法同步成功
添加定时任务,用来自动实时同步服务器A的文件,基本可以做到每秒同步一次
crontab -e
* * * * * sh /root/rsyncd.sh > /dev/null 2>&1
以上就已经全部完成了文件同步,然后前往对应服务器查看文件是否正常同步即可
扩展阅读:
在网上很多人写到说有用到“rsync + inotify"来做文件监听并实时同步(原理是:通过监听A服务器文件是否发生编辑、删除、移动、新增等操作时,自动执行同步脚本),我自己按照网上的方式,尝试了2-3个小时,最终失败告终,出现了无法同步的情况,只在系统第一次执行时,同步了,后续A服务器文件发生变动,B没有达到实时变动,应该是写的shell脚本出现了问题。
出现错误排查问题,错误整理:(这是使用过程中遇到的,整理一下)
1.检查rsync是否启动
ps -ef | grep rsync
如果显示表示未启动
u1204 26824 5681 0 16:07 pts/5 00:00:00 grep --color=auto rsync
使用如下脚本启动
/usr/bin/rsync --daemon --config=/etc/rsyncd.conf
再使用ps -ef | grep rsync出现,类似如下显示表示已经启动
root 26800 1 0 16:05 ? 00:00:00 /usr/bin/rsync --daemon --config=/etc/rsyncd.conf u1204 26824 5681 0 16:07 pts/5 00:00:00 grep --color=auto rsync
2.出现如下文件,注意检查是否启动了rsync进程,服务器端该模块(test)需要验证用户名密码,但客户端没有提供正确的用户名密码,认证失败。
提供正确的用户名密码解决此问题。
@ERROR: auth failed on module test rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3]
rsync mkdir "/test" (in www) failed: Permission denied (13)
二、实现redis共享session
因为服务器做了负载均衡,而session又是存在服务端,所以这里需要进行session存储位置调整。
如果使用了redis缓存,或者数据库搭建在网站同环境下,也需要进行同步绑定。redis绑定同一个服务器的redis,设置密码访问即可。数据库可以使用第三方数据库,例如:阿里云RDS
在使用如下方法时,需要先将redis配置成外网访问,否则其他服务器是无法正常调用到同一个redis环境的,具体可以参照另外一篇博客https://blog.csdn.net/sagittarius_520/article/details/99695006
第一种方法:
修改配置文件php.ini,修改为下面内容,指定redis路径,保存并重启服务
session.save_handler = redis session.save_path = "tcp://127.0.0.1:6379"
第二种方法:
在程序入口文件中,添加如下代码,指定redis路径
ini_set("session.save_handler", "redis"); ini_set("session.save_path", "tcp://127.0.0.1:6379");
注:如果配置文件redis.conf里设置了连接密码requirepass,save_path需要这样写tcp://127.0.0.1:6379?auth=authpwd ,否则保存session的时候会报错。
自己做了一定的调整,修复了其他文章中存在的一些错误。有需要的可以参考一下
参考文章如下:
https://blog.csdn.net/oljuydfcg/article/details/91639416
https://blog.csdn.net/david_xtd/article/details/11737075
https://blog.csdn.net/qq_21794887/article/details/93889065
https://www.cnblogs.com/lei0213/p/8595112.html