负载均衡-实现多台服务器代码同步rsync+实现redis共享session

原创
所属分类: 服务器运维 2019-08-17 597
来源:baidu.com

因为近期项目中需要用到负载均衡,所以查阅了比较多的资料,但是大部分文档都差不多的,说的都是相同的内容,所以导致出错都是相同的位置,相同的原因。所以这里将这些都整理一下,基础介绍就不写了,直接上方案。“前人种树,后人乘凉”,成长的过程中,总需要一些养分的~


一、负载均衡中实现代码同步rsync

1.准备两台已经配置好环境的服务器,A(源服务器,假设服务器IP:192.0.0.1),B(目标服务器,即将数据拷贝至此服务器中),后面文档中都用AB代替


2.将两台服务器都安装rsync组件

yum install rsync


3.安装完之后,查看rsync版本信息,如果正常查看则表示安装成功

rsync --version


4.配置A服务器( 4-7 都是配置的A服务器)

配置服务器时,注意一点,不要将注释与配置写在同一行,避免出现配置文件错误,如果需要写注释,那么单独取一行写(这里这样写的作用是方便大家查看每个配置的作用)

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


原创声明:本文为博主原创文章,转载请附上原文出处链接和声明。

相关推荐

更多内容>

Linux安装libreoffice实现Excel转换成pdf

服务器运维

centos安装杀毒软件clamAV

服务器运维

Let‘s Encrypt证书申请-CAA解析

服务器运维

简单几步即可判断Linux系统有无被DDOS攻击的方法

服务器运维
点这里分享到
朋友圈