原理部分就不多做介紹了,有需求請移步這位博友的文章
http://xiaorenwutest.blog.51cto.com/12754924/1920259
下面給出某企業平臺實例
一:所需服務器
服務器名稱 | 運行服務 | 服務端口 | Ip地址 | |
T1 | Nginx | 80 | 192.168.11.158 | 負載均衡 |
T2 | Nginx/httpd | 80,873 | 192.168.11.157 | 實際網站服務 |
T3 | Nginx/httpd | 80,873 | 192.168.11.161 | 實際網站服務 |
T4 | Nginx/httpd | 80,873 | 192.168.11.162 | 實際網站服務 |
T5 | Mysql | 8066 | 192.168.11.163 | Mysql讀寫分離 |
T6 | mysql | 3306 | 192.168.11.164 | Mysql主,寫 |
T7 | mysql | 3306 | 192.168.11.165 | Mysql從,讀 |
T8 | mysql | 3306 | 192.168.11.167 | Mysql從,讀 |
T9 | Sersync+ftp | 21 | 192.168.11.156 | 網站存放,上傳 |
說明:1,前期可只有T1,只有一臺服務器提供所有的服務。
2,先分離mysql變兩臺服務器,即T1和T6
3,再分離T6,即T6也做讀寫分離服務,新增T7
4,T1分離成T1,T2。。。。。,T1最終只做負載。
5,分離T6只做mysql寫服務,新增T5,程序代碼服務器連接改成T5的IP和8066
端口,並可新增T8,變成最終的情況
6,T9前期可以不用,由T1負責即可。後面T1負載太大,獨立出來。
7,負載加大,這時考慮用LVS或硬件的負載均衡。
二:搭建過程
1,web服務和rsync服務
1)T1-T4全做成LNMP服務。過程這裏不做詳細說明。可以下載一鍵安裝包即可解決
T1的nginx需要另外寫入如下代碼:(各有不同,可百度)
upstream 127.0.0.1 { #前面的127.0.0.1換成網站域名
#這裏就是T2-T4服務器地址,需要根據實際情況填寫
server 192.168.11.157;
server 192.168.11.161;
server 192.168.11.162;
}
server {
listen 80;
server_name yhzxq.eicp.net; #網站域名,最好把www和沒有www的都填上
access_log /data/wwwlogs/yhzxq.eicp.net_nginx.log combined;
#日誌路徑,方便查看客戶登陸情況
location / {
proxy_pass http://127.0.0.1; #網站域名
}
這樣,WEB服務就搭建完成。
2)rsync服務
安裝xinetd,rsync的守護進程
yum install xinetd -y (前面要小寫)
編寫rsyncd.conf
vim /etc/rsyncd.conf #內容如下:
uid = root
gid = root
max connections = 2
strict modes = yes
port = 873
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
secrets file = /etc/rsync.pas #同步密碼文件,安全考慮,有那個auth users=就必須有這個
[www]
path = /data/www/
comment = This is Mysql db backup
ignore errors
list = no
read only =no
auth users = zxq #同步的用戶
#hosts allow = 115.29.227.109 #這裏是添加信任站點,對於雲服務器來說非常重要
#hosts allow = 192.168.11.252 #即允許T9來訪問。當然,在IPTABLES裏控制也可以。
編寫密碼文件vim /etc/rsync.pas (文件名對應secrets file選項)內容如下:
zxq:123456 (用戶名+‘:’+密碼)
chmod 600 /etc/rsync.pas (密碼文件必須用這個權限)
IPTABLES開放873端口,重啓IPTABLES ,重啓xinted
Netstat -ln |grep 873 #查看rsync服務是否運行。
測試:客戶機先建立密碼文件內容是123456(同rsync服務器那有點不同,這裏只需要密碼,不要寫用戶名,權限同樣是600)
Rsync -az --delete --password-file=/.etc/rsync.pas /tmp/* [email protected]::www
正常會顯示傳輸的情況,如果不對,請自行百度。一般是權限和端口的問題。
2,T9:安裝VSFTP,參考http://xrzxq.eicp.net/?id=5(本人博客)
完成後可以把添加用戶的腳本加上,注意路徑即可。
1)搭建sersync
環境檢測:
sysctl -a | grep max_queued_events
結果是:fs.inotify.max_queued_events = 16384
sysctl -a | grep max_user_watches
結果是:fs.inotify.max_user_watches = 8192
sysctl -a | grep max_user_instances
結果是:fs.inotify.max_user_instances = 128
修改參數:
sysctl -w fs.inotify.max_queued_events="99999999"
sysctl -w fs.inotify.max_user_watches="99999999"
sysctl -w fs.inotify.max_user_instances="65535"
vi /etc/sysctl.conf #添加以下代碼
fs.inotify.max_queued_events=99999999
fs.inotify.max_user_watches=99999999
fs.inotify.max_user_instances=65535
按:w保存退出。
Sersync下載鏈接:http://pan.baidu.com/s/1dEdyDAp 密碼:mb8p 好後上傳到服務器。或者
wget https://sersync.googlecode.com/files/sersync2.5.4_64bit_binary_stable_final.tar.gz
解壓,並把文件移到./usr/local./sersync下面,再修改相關的配置文件
vim /usr/local/sersync/confxml.xml(最好先備份一下,只改以下紅色的部份)
<sersync>
<localpath watch="/home/www.osyunwei.com">
<remote ip="192.168.21.127" name="home_www.osyunwei.com"/>
<remote ip="192.168.21.128" name="home_www.osyunwei.com"/>
<!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath>
<rsync>
<commonParams params="-artuz"/>
<auth start="true" users="home_www.osyunwei.com_user" passwordfile="/etc/passwd.txt"/>
<userDefinedPort start="false" port="874"/><!-- port=874 -->
<timeout start="false" time="100"/><!-- timeout=100 -->
<ssh start="false"/>
</rsync>
<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
<crontab start="true" schedule="600"><!--600mins-->
解釋:<localpath watch>這是源路徑,需同步的都放在這裏,同時這也是FTP上傳路徑。
<remote ip>這是rsync服務器的地址 name是rsync的模塊,這個可以有多個。
<auth start>開始,users=這是rsync服務器的同步用戶,後面的是密碼文件路徑。
<crontab start>這裏設置全同步時間,600分鐘同步一次。注意,後面有腳本,每5分鐘檢查一次有沒有運行(時間當然可以自定義)。
設置sersync開機啓動
vim /etc/rc.local
添加/usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/confxml.xml
創建腳本:
vim ~/script/check_sersync.sh
#!/bin/sh
sersync="/usr/local/sersync/sersync2"
confxml="/usr/local/sersync/confxml.xml"
status=$(ps aux |grep 'sersync2'|grep -v 'grep'|wc -l)
if [ $status -eq 0 ];
then
$sersync -d -r -o $confxml &
else
exit 0;
fi
按:w保存,並在crontab裏添加每5分鐘執行一次,重啓服務器。
完成重啓後,在WEB那幾臺服務器上查看是否有文件同步過來即可。
當然,有錯可以先看日誌,百度。
至此,web服務器搭建完成。
MYSQL:
T6-T8安裝mysql5.7服務,(注意,5.6版本不支持明文密碼備份,5.7雖然也有提示,但備份成功)到搜狐源下載編譯版本,解壓到/usr/local/mysql下面,並編輯/etc/profile文件,新增mysql路徑/usr/local/mysql/bin
1,MYSQL安裝
1)新增mysql運行用戶
useradd mysql -s /sbin/nologin
創建數據保存目錄,注意,可以先用df 查看一下分區情況,選擇空間比較大的分區存放
mkdir /data/mysql -p
用/usr/local/mysql/bin/mysqld --initialize --user=mysql --datadir=/data/mysql
Mysql安裝過程中會產生隨機密碼,注意記錄,會用這個密碼登錄來修改自己的密碼的。
安裝好後,用剛記錄的密碼登陸mysql
mysql -uroot -p(密碼)
use mysql
set password for root@’localhost’=password(‘new_password’);
flush privileges;
設置新密碼成功。
2)主從同步的設置
在主服務器裏新增一個用於同步的帳號:
grant all privelieges on *.* to 'root'@'%' identified by '123!@#qwe';
%表示任何主機都可以連接,by 後面的是密碼,設置可以複雜一點
這需要在iptables裏做安全設置
修改my.cnf,增加以下內容:
server-id=1
log-bin=XXX #同步的標示符,二進制文件名,可以自義
binlog-do-db=your_DB #同步的數據庫,可以有多個,用逗號隔開
log-slave-updates
sync_binlog=1
auto-increment-increment=2
auto-increment-offset=1
slave-skip-errors=all
設置完成,重啓mysql:/etc/init.d/mysqld restart
在從服務器裏,修改my.cnf
server-id=2
log-bin=XXX #同步的標示符,與主那邊一致
replicate-do-db = mydb #同步的數據庫,與主那邊的binlog-do-db對應
log-slave-updates
sync_binlog=1
auto-increment-increment=2
auto-increment-offset=2 #這是用來區分服務器的,如還有,則設置成不同
slave-skip-errors=all
設置完成,重啓mysql,並進入到數據庫裏
導入完同步的數據庫,打入以下命令
stop slave;
reset slave;
change master to master_host=’主服務器地址’,master_user=’剛設置的同步用戶’,master_password=’剛設置的同步用戶的密碼’;
(一般情況下,同步完成,如果出錯,請自行百度一下,根據出錯的提示解決,一定要小心檢查)
這時,同步設置完成,
Start slave; (開啓同步)
Show slave status \G(注意,這裏用\G表示命令結束,這樣看提示信息比較好看)
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
確保信息裏,以上提示爲yes,同步即成功。
2,安裝amoeba
簡單介紹一下amoeba是阿里巴巴旗下的開源軟件,專爲mysql等做負載或讀寫用的。
基於java開發,所以要先安裝java支持。
到http://java.sun.com/javase/downloads/index.jsp下載java
現在是rpm的安裝包,用rpm -ivh 安裝即可。
使用java -version查看安裝的版本號
java version "1.8.0_74" #這是我的版本
現在,添加java路徑,注意,這裏網上教程都有不太對的地方。
實際上要添加的路徑是java下的jre的路徑,可用find命令查找一下。一般在/usr/java/jdk1.8.0_74/jre/bin/java
編輯/etc/profile添加
JAVA_HOME=/usr/java/jdk1.8.0_74
PATH=$PATH:JAVA_HOME/bin
export JAVA_HOME PATH
:w保存
source /etc/profile 即可
這時就可以用amoeba了,但一般運行後會馬上提示堆棧不夠,這是因爲amoeba裏定義得太少了,修改amoeba文件即可
vim /usr/local/amoeba/bin/amoeba
DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss256k"(這是改後的,一般是128k)
修改amoeba的配置文件,這裏主要是兩個xml文件:dbServer.xml amoeba.xml
它們都在conf文件夾下,兩個文件裏關於用戶的定義一定相同,也即是有數據庫使用權限的用戶
Amoeba.xml:
<property name="port">3306</property> #數據庫的訪問端口
<!-- mysql schema -->
<property name="schema">wordpress</property> #同步的數據庫,注意這裏只支持一個庫,所以主從同步時設置多個庫也好,在這裏只有一個可以做讀寫分離的
<!-- mysql user -->
<property name="user">zxq</property> #訪問數據庫的用戶
<property name="password">123!@#qwe</property> #對應用戶的密碼
dbServer.xml:
關於用戶密碼的配置和amoeba相同,不同的是這裏可以配置多臺服務器的信息
<dbServer name="server1" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.11.164</property>
</factoryConfig>
</dbServer>
以上是一臺機的配置,主要是填寫IP地址。
好了以後可用amoeba start & 後臺運行
netstat -ln |grep 8066 檢測有沒有運行,注意使用端口
安裝一個mysql客戶端,使用mysql登陸試試看,注意端口
Mysql -u zxq -p -h 192.168.11.164 -P8066 #(回車後輸入密碼)
請自行建表或插入數據測試,至此,數據庫的主從同步,讀寫分離搭建完成。