Azure + MongoDB - NoSQL数据库集群初探(实践篇)
Posted 行云拨雾
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Azure + MongoDB - NoSQL数据库集群初探(实践篇)相关的知识,希望对你有一定的参考价值。
然后接着上篇的理论篇,本篇在Azure上部署MongoDB集群,纯干货。所有资源均创建于西欧(westeurope)。
Azure基础环境搭建
创建资源组,虚拟网络等
需要本地安装Azure CLI命令行工具包,然后在本地终端如 cmd
/powershell
/运行
az命令
bash 登录Azure账户并创建资源组
az login
az group create --name azeu-proj-infra --location westeurope
az group create --name azeu-proj-db --location westeurope
az group create --name azcn-proj-public --location westeurope
az network vnet create --resource-group azeu-proj-infra --name azcn-proj-vnet01 --address-prefix 10.14.192.0/21
public01
和 db01
子网
az network vnet subnet create --resource-group azeu-proj-infra --vnet-name azcn-proj-vnet01 --name public01 --address-prefixes 10.14.192.0/24
az network vnet subnet create --resource-group azeu-proj-infra --vnet-name azcn-proj-vnet01 --name db01 --address-prefixes 10.14.194.0/24
注意:Azure中同一虚拟网络(VNet)下不同子网默认就可以直接互相访问:
az network nsg create --resource-group azeu-proj-db --name db-nsg
打一个定制化的CentOS7.6镜像
使用 CentOS7.6
纯净模板 Linux VM 作为虚拟机映像的原型机,修改一些内核参数,提高并发能力。
az vm create --resource-group azeu-proj-infra --name centos76image01 --image OpenLogic:CentOS:7.6:latest --admin-username azureuser --ssh-key-value ~/.ssh/id_rsa.pub --size Standard_B1s --location westeurope
centos7.6
虚拟机参数
sudo su
#禁用SELINUX
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/sysconfig/selinux && cat /etc/sysconfig/selinux
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config && cat /etc/selinux/config
#sestatus 查看SELINUX状态。reboot后再次查看确保disable
sestatus
#安装epel-release源
yum install epel-release -y
#安装基础依赖库
yum install tree wget sysstat telnet tcpdump tee mlocate bind-utils lrzsz lsof psmisc perl screen unzip git -y
#禁用ssh密码
vim /etc/ssh/sshd_config
PasswordAuthentication no
PubkeyAuthentication yes
StrictModes no
#设置开机启动并重启服务
systemctl restart sshd
systemctl enable sshd
#修改句柄 最大打开文件数、最大进程数
echo "* soft nofile 65536" >> /etc/security/limits.conf
echo "* hard nofile 65536" >> /etc/security/limits.conf
echo "* soft nproc 65536" >> /etc/security/limits.conf
echo "* hard nproc 65536" >> /etc/security/limits.conf
#修改最大进程数
vim /etc/security/limits.d/20-nproc.conf
* soft nproc 65536
root hard nproc 65536
#内核参数调整:
vim /usr/lib/sysctl.d/00-system.conf
# 添加以下字段
kernel.panic = 5
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.ip_local_port_range = 10000 65000
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_tw_reuse = 0
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.core.netdev_max_backlog = 262144
net.core.rmem_max = 8388608
net.core.wmem_max = 8388608
net.core.somaxconn = 65535
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.all.disable_ipv6 = 1
#sudo权限设置 sudo用户组所有用户
cat > /etc/sudoers.d/sa <<EOF
%sudo ALL=(ALL:ALL) NOPASSWD:ALL
EOF
#在centos76image01虚拟机上取消VM预配信息
sudo waagent -deprovision
#可以退出ssh啦
换本地终端执行如下Azure CLI命令
#解除VM分配
az vm deallocate --resource-group azeu-proj-infra --name centos76image01
#将VM进行通用化
az vm generalize --resource-group azeu-proj-infra --name centos76image01
#创建Image
az image create --resource-group azeu-proj-infra --name centos76image01 --source
部署跳板机
为了保障服务器的网络安全,后续创建的所有VMs默认均无公共IP地址,只有内网IP,本地无法通过internet直接进行访问。而后续需要登入内网中的VMs进行服务配置,因此我们可以在public01子网中创建一个拥有公网IP的跳板机。当需要对服务器进行配置时,就可从本地ssh至跳板机,再通过跳板机执行对服务器的一系列配置、部署操作。like this:
Ansible
sudo yum install ansible
#配置Ansible
vim /etc/ansible/ansible.cfg
host_key_checking = False
remote_user = azureuser
官网步骤:https://docs.microsoft.com/zh-cn/cli/azure/install-azure-cli-yum?view=azure-cli-latest
sudo yum install azure-cli
ssh-keygen -t rsa
MongoDB集群部署
集群架构
批量创建MongoDB集群
跳板机上操作
#【机器名】 【机器型号】 【子网IP】 【Azure可用区域】
vim mongodb
mongodb01 Standard_B1s 10.14.194.9 1
mongodb02 Standard_B1s 10.14.194.10 1
mongodb03 Standard_B1s 10.14.194.11 3
mongodb04 Standard_B1s 10.14.194.12 1
mongodb05 Standard_B1s 10.14.194.13 1
mongodb06 Standard_B1s 10.14.194.14 3
mongodb07 Standard_B1s 10.14.194.15 1
mongodb08 Standard_B1s 10.14.194.16 1
mongodb09 Standard_B1s 10.14.194.17 3
mongodb10 Standard_B1s 10.14.194.18 1
mongodb11 Standard_B1s 10.14.194.19 1
mongodb12 Standard_B1s 10.14.194.20 3
mongos01 Standard_B1s 10.14.194.21 1
mongos02 Standard_B1s 10.14.194.22 1
mongos03 Standard_B1s 10.14.194.23 3
#定义资源组
export rg=azeu-proj-db
#定义子网id
export subnetid=/subscriptions/订阅号/resourceGroups/azeu-proj-infra/providers/Microsoft.Network/virtualNetworks/azcn-proj-vnet01/subnets/db01
#定义安装位置
export location=westeurope
#定义镜像id
export imageid=/subscriptions/订阅号/resourceGroups/azeu-proj-infra/providers/Microsoft.Compute/images/centos76image01
#定义sshkey位置
export sshkey=~/.ssh/id_rsa.pub
vim
的配置文件 mongodb 批量创建NIC网卡和虚拟机
#创建子网接口 使用机器配置规格文件
while read line; \
do az network nic create \
--resource-group $rg \
--subnet $subnetid \
-n $(echo $line |awk '{print $1}') \
-l $location \
--private-ip-address $(echo $line |awk '{print $3}'); \
done < mongodb
#创建VM 使用机器配置规格文件
while read line; \
do az vm create \
-n $(echo $line |awk '{print $1}') \
-g $rg --image $imageid \
--nics $(echo $line |awk '{print $1}') \
--admin-username azureuser \
--ssh-key-value $sshkey \
--size $(echo $line |awk '{print $2}') \
--storage-sku Standard_LRS\
-z $(echo $line |awk '{print $4}') \
-l $location \
--no-wait;
done < mongodb
Ansible
是否连通
ansible -i hosts/mongodb mongodb -m ping
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.4.17.tgz
#启用Python自带的SimpleHTTPServer实现内网共享
sudo python -m SimpleHTTPServer 80
#保持当前命令行窗口打开,不要关闭
Ansible
脚本批量安装MongoDB
#运行环境:JumpVM
#新开个终端命令行ssh到jumpVM
#进入MongoDB的Ansible部署脚本文件夹
#nvme 磁盘创建 xfs 文件系统,并挂载目录/data1(MongoDB 节点的数据存放目录)
ansible-playbook -i hosts/mongodb -b playbooks/mkfs-mount.yml
/dev/sdb
变成了
xfs
格式并挂载了
/data1
。需要注意的是,如果服务器重启,该盘格式和数据会丢,需要重新跑遍
Ansible
脚本
#安装MongoDB基础环境
ansible-playbook -i hosts/mongodb -b playbooks/install-mongodb-arch.yml
#部署 configserver
ansible-playbook -i hosts/mongodb -b playbooks/install-mongodb-configserver.yml
#部署 shard1~4 分片
ansible-playbook -i hosts/mongodb -b playbooks/install-mongodb-shard.yml --extra-vars 'hosts=shard1'
ansible-playbook -i hosts/mongodb -b playbooks/install-mongodb-shard.yml --extra-vars 'hosts=shard2'
ansible-playbook -i hosts/mongodb -b playbooks/install-mongodb-shard.yml --extra-vars 'hosts=shard3'
ansible-playbook -i hosts/mongodb -b playbooks/install-mongodb-shard.yml --extra-vars 'hosts=shard4'
#启动configserver 并初始化副本集
ansible-playbook -i hosts/mongodb -b playbooks/start-mongodb-configserver.yml
config server
#跳板机登陆到预置主节点10.14.194.21 (mongos01)
ssh azureuser@mongos01
#进入mongo shell
mongo 127.0.0.1:61101/admin
//配置服务器变量
configserver = {
_id : "configserver",
members : [
{_id : 0, host : "10.14.194.21:61101" , priority: 3 },
{_id : 1, host : "10.14.194.22:61101" , priority: 2 },
{_id : 2, host : "10.14.194.23:61101" , priority: 1 }
]
}
//初始化配置服务器
rs.initiate(configserver);
ok=1
:
//切换 admin库
use admin
//创建用户:
db.createUser(
{
user:"root",
pwd:"proj2019",
roles:["root"]
}
)
//退出mongo shell
exit
//断开跳板机到mongos01的ssh连接
exit
#在跳板机上进行操作
#启动shard1并初始化
ansible-playbook -i hosts/mongodb -b playbooks/start-mongodb-shard.yml --extra-vars 'hosts=shard1'
#登录到当前分片预置主节点10.14.194.9 mongodb01
ssh azureuser@mongodb01
#进入mongo shell
mongo 127.0.0.1:62001/admin
//shard1配置
shard1config = {
_id : "shard1",
members : [
{_id : 0, host : "10.14.194.9:62001" , priority: 3 },
{_id : 1, host : "10.14.194.10:62001" , priority: 2 },
{_id : 2, host : "10.14.194.11:62001" , priority: 1 }
]
}
rs.initiate(shard1config);
//切换 admin库
use admin
//创建用户:
db.createUser(
{
user:"root",
pwd:"proj2019",
roles:["root"]
}
)
#退出shell
#退出跳板机到mongodb01的ssh的连接
mongos
#启动mongos并初始化。启动后,mongos 服务监听端口 62201
ansible-playbook -i hosts/mongodb -b playbooks/start-mongodb-mongos.yml
#登陆到 mongos01 10.14.194.21 节点,通过 mongo shell 添加用户权限并增加分片,添加分片路由规则
ssh azureuser@mongos01
mongo 127.0.0.1:62201/admin
db.auth("root", "proj2019")
sh.addShard("shard1/10.14.194.9:62001,10.14.194.10:62001,10.14.194.11:62001")
sh.addShard("shard2/10.14.194.12:62002,10.14.194.13:62002,10.14.194.14:62002")
sh.addShard("shard3/10.14.194.15:62003,10.14.194.16:62003,10.14.194.17:62003")
sh.addShard("shard4/10.14.194.18:62004,10.14.194.19:62004,10.14.194.20:62004")
ok=1
了
sh.status()
mongo 127.0.0.1:62201/admin
db.auth("root", "proj2019")
#建立一个database, 名称是test
use test
#建立一个集合,名称是demo
db.createCollection("demo")
#把这个集合的sharding功能打开
sh.enableSharding("demo")
config server
,配置集合的分片方式
mongo 127.0.0.1:61101/admin
db.auth("root","proj2019")
use config
#查看目前database sharding的情况
db.databases.find()
test db
的
shard
还没打开,先不管它往下走
sh.shardCollection("test.demo",{"_id":"hashed"})
test
没有打开
sharding
功能,正如上上图所示。
db.adminCommand("flushRouterConfig")
sh.enableSharding("test")
sh.shardCollection("test.demo",{"_id":"hashed"})
mongo 127.0.0.1:62201/admin
db.auth("root", "proj2019")
use test
#往集合demo里插入数据
for(var i=1;i<=100000;i++){ db.demo.insert({"id":i,"myName":"demo"+i,"myDate":new Date()}); }
#可以在另外的console查询数据是否插入完成;若完成,count应该显示100000
db.demo.count()
db.demo.stats()
至此,MongoDB集群在Azure上创建完成,篇幅较长,能看到最后的都是壮士......其实只有自己动手操作后才发现会遇到很多坑,而debug的过程是痛并快乐着的(解决以后才会快乐)。然后wx的排版真让人崩溃QwQ
参考资料
以上是关于Azure + MongoDB - NoSQL数据库集群初探(实践篇)的主要内容,如果未能解决你的问题,请参考以下文章
通过php的MongoDB driver连接Azure的DocumentDB PaaS
囤货:512M免费MongoDb云数据库,50万记录存储真香