標籤:fork framework image 通過 分享 管理 分析 secondary src
1、環境準備
1、Centos7
2、mongodb3.4.9
3、三台機器IP分別是:10.170.1.16、10.170.1.18、10.170.1.33
2、mongdb資料庫的安裝
如下操作是分別在三台機器進行
1、首先分別在三台機器上下載好mongodb安裝包mongodb-linux-x86_64-amazon-3.4.9.tgz
2、使用tar命令解壓安裝包然後修改解壓後的目錄名
tar zxvf mongodb-linux-x86_64-amazon-3.4.9.tgz
mv mongodb-linux-x86_64-amazon-3.4.9.tgz mongodb
3、
進入 mongodb目錄中建立三個目錄conf、logs 、db
conf儲存設定檔目錄,logs用來儲存日誌目錄,db用來儲存資料目錄
cd mongodb
mkdir conf logs db
4、
進入conf目錄建立mongodb的設定檔mongodb.conf
cd conf
touch mongodb.conf
5、
編寫設定檔mongodb.conf,內容如下
其中dbpath是資料庫檔案目錄,logpath是日誌目錄,port是mongodb所佔用的連接埠,fork是true的時候表示在後台啟動
dbpath=/data/mongodb/db
logpath=/data/mongodb/log/mongodb.log
port=27017
fork=true
6、
分別在三台機器上啟動mongodb 其中–replSet表示複本集群參數 ,mongoTest是複本集名稱,這裡的名字可以任意取,另外兩台機也要和這個一樣
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/mongodb.conf --replSet mongoTest
7、
配置複本集
進入mongodb:
mongo 10.170.1.16:27017/admin -u test -p
輸入密碼
config_test={_id : ‘mongoTest‘,members : [{_id : 0, host : ‘10.170.1.16:27017‘},{_id : 1, host : ‘10.170.1.18:27017‘},{_id : 2, host : ‘10.170.1.33:27017‘}]}
初始化複本集
rs.initiate(config_test);
查看副本狀態
rs.status();
health表示複本集中該節點是否正常,0表示不正常,1表示正常;state表示節點的身份,0表示非主節點,1表示主節點;stateStr用於對節點身份進行字元描述,PRIMARY表示主節點,SECONDARY表示副節點;name是複本集節點的ip和連接埠資訊
查看副本同步狀態
db.printSlaveReplicationInfo();
8、主庫配置使用者
在沒有添加許可權之前進入到mongodb主庫操作頁面並添加使用者
db.createUser({user:‘admin‘,pwd:‘admin‘,roles:[{role:‘userAdminAnyDatabase
‘,db:‘admin‘}]})
剛建立了 userAdminAnyDatabase 角色,用來系統管理使用者,可以通過這個角色來建立、刪除使用者。
9、增加安全認證機制KeyFile
mkdir -p /data/mongo_set/usercenter/27017/
touch mongodb-keyfile
#產生key
openssl rand -base64 745 > /data/mongo_set/usercenter/27017/mongodb-keyfile
chmod 600 /data/mongo_set/usercenter/27017/mongodb-keyfile
# 該key的許可權必須是600
註:將該key放到叢集中機器的每一台上,記住必須保持一致,使用權限設定成600;
修改mongodb.conf配置
keyFile=/data/mongo_set/usercenter/27017/mongodb-keyfile
重新啟用所有伺服器
註:記住重新啟動時候,keyfile的指定如果沒有在設定檔中配置,就必須啟動時候使用參數keyfile指定,關閉順序注意下,mongodb叢集有自動切換主庫功能,如果先關主庫,主庫就切換到其它上面去了,這裡預防主庫變更,從庫關閉後再關閉主庫
開啟keyfile認證就預設開啟了auth認證了,在此可以用之前建立的帳號進行登入
10、最後檢查主從的狀態
rs.status();
11、配置複本集的讀寫分離
配置複本集的讀寫分離需要以下兩步:
(1)在副本節點上設定setSlaveOk(為了使從機變為可讀狀態);
通過命令sudo find / -name .mongorc.js找到.mongorc.js
在.mongorc.js中添加rs.slaveOk();
註:一般這個檔案都是空的,直接加上去。儲存退出。之後退出mongo在進去就可以了。
盡量每台伺服器都添加上去。
(2)代碼層面,在讀操作過程中設定從副本節點讀取資料,如下所示:
ReadPreference preference = ReadPreference.secondary();
mongoTemplate.setReadPreference(preference);
配置完後經過測試讀操作就會自動分配到從伺服器,而寫操作則在主伺服器進行
這部分可以從控制台查看日誌進行分析
附單元測試程式:
package com.sinoway.cisp;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import com.sinoway.cisp.constant.CollectionEnum;
import com.sinoway.cisp.mongo.collection.BasicReport;
import com.sinoway.cisp.mongo.dao.SinowayReportDao;
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class XMLTest {
@Autowired
private SinowayReportDao reportDao;
@Test
public void testSql() {
System.out.println("++++++++++++++++++++++++開始讀");
BasicReport historyReport = reportDao.findOneBySinoCardid("SW-8X760156-20161122",
BasicReport.class, CollectionEnum.HISTORYREPORT_COLLECTION_NAME.getCollectionName());
System.out.println(historyReport);
System.out.println("++++++++++++++++++++++++讀結束");
System.out.println("++++++++++++++++++++++++開始寫");
BasicReport report = new BasicReport();
report.setSino_cardid("3333");
reportDao.insertOneReport(report);
System.out.println("++++++++++++++++++++++++寫結束");
}
}
這些可以從控制台的日誌中查看,例如:剛才進行了讀操作,
16是從機
下面進行了一次寫操作,輸出如下
18是主機
可以查看主從狀態
經測試,刪除操作也在主機進行,所以不屬於讀操作
經測試:mongodb中upsert方法屬於寫操作
MongoDB的搭建並配置主從以及讀寫分離