Azure + MongoDB - NoSQL数据库集群初探(实践篇)

Posted 行云拨雾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Azure + MongoDB - NoSQL数据库集群初探(实践篇)相关的知识,希望对你有一定的参考价值。

然后接着上篇的理论篇,本篇在Azure上部署MongoDB集群,纯干货。所有资源均创建于西欧(westeurope)。

Azure基础环境搭建

创建资源组,虚拟网络等

需要本地安装Azure CLI命令行工具包,然后在本地终端如 cmd / powershell / 运行az 命令bash 登录Azure账户并创建资源组
 
   
   
 
  1. az login
  2. az group create --name azeu-proj-infra --location westeurope
  3. az group create --name azeu-proj-db --location westeurope
  4. az group create --name azcn-proj-public --location westeurope


like this:
Azure + MongoDB - NoSQL数据库集群初探(实践篇)
创建虚拟网络
 
   
   
 
  1. az network vnet create --resource-group azeu-proj-infra --name azcn-proj-vnet01 --address-prefix 10.14.192.0/21
创建 public01db01 子网
 
   
   
 
  1. az network vnet subnet create --resource-group azeu-proj-infra --vnet-name azcn-proj-vnet01 --name public01 --address-prefixes 10.14.192.0/24
  2. az network vnet subnet create --resource-group azeu-proj-infra --vnet-name azcn-proj-vnet01 --name db01 --address-prefixes 10.14.194.0/24
创好后在Portal中能查看:
Azure + MongoDB - NoSQL数据库集群初探(实践篇)
注意:Azure中同一虚拟网络(VNet)下不同子网默认就可以直接互相访问:
Azure + MongoDB - NoSQL数据库集群初探(实践篇)
创建网络安全组
 
   
   
 
  1. az network nsg create --resource-group azeu-proj-db --name db-nsg


打一个定制化的CentOS7.6镜像

使用 CentOS7.6 纯净模板 Linux VM 作为虚拟机映像的原型机,修改一些内核参数,提高并发能力。
 
   
   
 
  1. 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 虚拟机参数
ssh至刚创好的虚机,先 sudo su
 
   
   
 
  1. #禁用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

  2. #安装epel-release源

yum install epel-release -y


  1. #安装基础依赖库
  2. yum install tree wget sysstat telnet tcpdump tee mlocate bind-utils lrzsz lsof psmisc perl screen unzip git -y


  3. #禁用ssh密码
  4. vim /etc/ssh/sshd_config
  5. PasswordAuthentication no
  6. PubkeyAuthentication yes
  7. StrictModes no



  8. #设置开机启动并重启服务
  9. systemctl restart sshd
  10. systemctl enable sshd

  11. #修改句柄 最大打开文件数、最大进程数
  12. echo "* soft nofile 65536" >> /etc/security/limits.conf
  13. echo "* hard nofile 65536" >> /etc/security/limits.conf
  14. echo "* soft nproc 65536" >> /etc/security/limits.conf
  15. echo "* hard nproc 65536" >> /etc/security/limits.conf

  16. #修改最大进程数
  17. vim /etc/security/limits.d/20-nproc.conf
  18. * soft nproc 65536
  19. root hard nproc 65536



  20. #内核参数调整:
  21. vim /usr/lib/sysctl.d/00-system.conf
  22. # 添加以下字段
  23. kernel.panic = 5
  24. net.ipv4.tcp_syncookies = 1
  25. net.ipv4.tcp_max_syn_backlog = 262144
  26. net.ipv4.ip_local_port_range = 10000 65000
  27. net.ipv4.tcp_timestamps = 1
  28. net.ipv4.tcp_tw_reuse = 0
  29. net.ipv6.conf.all.disable_ipv6 = 1
  30. net.ipv6.conf.default.disable_ipv6 = 1
  31. net.core.netdev_max_backlog = 262144
  32. net.core.rmem_max = 8388608
  33. net.core.wmem_max = 8388608
  34. net.core.somaxconn = 65535
  35. net.ipv6.conf.default.disable_ipv6 = 1
  36. net.ipv6.conf.all.disable_ipv6 = 1



  37. #sudo权限设置 sudo用户组所有用户
  38. cat > /etc/sudoers.d/sa <<EOF
  39. %sudo ALL=(ALL:ALL) NOPASSWD:ALL
  40. EOF


制作映像
 
   
   
 
  1. #在centos76image01虚拟机上取消VM预配信息
  2. sudo waagent -deprovision
  3. #可以退出ssh啦
换本地终端执行如下Azure CLI命令
 
   
   
 
  1. #解除VM分配
  2. az vm deallocate --resource-group azeu-proj-infra --name centos76image01
  3. #将VM进行通用化
  4. az vm generalize --resource-group azeu-proj-infra --name centos76image01
  5. #创建Image
  6. az image create --resource-group azeu-proj-infra --name centos76image01 --source


Azure + MongoDB - NoSQL数据库集群初探(实践篇)
↑↑新 鲜出炉的OS安装盘↑↑↑

部署跳板机

为了保障服务器的网络安全,后续创建的所有VMs默认均无公共IP地址,只有内网IP,本地无法通过internet直接进行访问。而后续需要登入内网中的VMs进行服务配置,因此我们可以在public01子网中创建一个拥有公网IP的跳板机。当需要对服务器进行配置时,就可从本地ssh至跳板机,再通过跳板机执行对服务器的一系列配置、部署操作。like this:
Azure + MongoDB - NoSQL数据库集群初探(实践篇)
Azure Portal中随意创建一个Linux虚机,我这儿创建了CentOS 7.5的。
ssh至该虚机:
安装 Ansible
 
   
   
 
  1. sudo yum install ansible
  2. #配置Ansible
  3. vim /etc/ansible/ansible.cfg
  4. host_key_checking = False
  5. remote_user = azureuser
然后把Ansible脚本上传至跳板机:
Azure + MongoDB - NoSQL数据库集群初探(实践篇)
点此下载 私聊
先搂一眼:
Azure + MongoDB - NoSQL数据库集群初探(实践篇)
安装Azure CLI
官网步骤:https://docs.microsoft.com/zh-cn/cli/azure/install-azure-cli-yum?view=azure-cli-latest
 
   
   
 
  1. sudo yum install azure-cli
生成ssh公密钥对
 
   
   
 
  1. ssh-keygen -t rsa

MongoDB集群部署

集群架构

Azure + MongoDB - NoSQL数据库集群初探(实践篇)

批量创建MongoDB集群

跳板机上操作
创建机器配置规格文件
 
   
   
 
  1. #【机器名】 【机器型号】 【子网IP】 【Azure可用区域】
  2. vim mongodb
  3. mongodb01 Standard_B1s 10.14.194.9 1
  4. mongodb02 Standard_B1s 10.14.194.10 1
  5. mongodb03 Standard_B1s 10.14.194.11 3
  6. mongodb04 Standard_B1s 10.14.194.12 1
  7. mongodb05 Standard_B1s 10.14.194.13 1
  8. mongodb06 Standard_B1s 10.14.194.14 3
  9. mongodb07 Standard_B1s 10.14.194.15 1
  10. mongodb08 Standard_B1s 10.14.194.16 1
  11. mongodb09 Standard_B1s 10.14.194.17 3
  12. mongodb10 Standard_B1s 10.14.194.18 1
  13. mongodb11 Standard_B1s 10.14.194.19 1
  14. mongodb12 Standard_B1s 10.14.194.20 3
  15. mongos01 Standard_B1s 10.14.194.21 1
  16. mongos02 Standard_B1s 10.14.194.22 1
  17. mongos03 Standard_B1s 10.14.194.23 3
定义linux变量
 
   
   
 
  1. #定义资源组
  2. export rg=azeu-proj-db

  3. #定义子网id
  4. export subnetid=/subscriptions/订阅号/resourceGroups/azeu-proj-infra/providers/Microsoft.Network/virtualNetworks/azcn-proj-vnet01/subnets/db01


  5. #定义安装位置
  6. export location=westeurope

  7. #定义镜像id
  8. export imageid=/subscriptions/订阅号/resourceGroups/azeu-proj-infra/providers/Microsoft.Compute/images/centos76image01


  9. #定义sshkey位置
  10. export sshkey=~/.ssh/id_rsa.pub
使用上面 vim的配置文件 mongodb 批量创建NIC网卡和虚拟机
 
   
   
 
  1. #创建子网接口 使用机器配置规格文件
  2. while read line; \
  3. do az network nic create \
  4. --resource-group $rg \
  5. --subnet $subnetid \
  6. -n $(echo $line |awk '{print $1}') \
  7. -l $location \
  8. --private-ip-address $(echo $line |awk '{print $3}'); \
  9. done < mongodb

  10. #创建VM 使用机器配置规格文件
  11. while read line; \
  12. do az vm create \
  13. -n $(echo $line |awk '{print $1}') \
  14. -g $rg --image $imageid \
  15. --nics $(echo $line |awk '{print $1}') \
  16. --admin-username azureuser \
  17. --ssh-key-value $sshkey \
  18. --size $(echo $line |awk '{print $2}') \
  19. --storage-sku Standard_LRS\
  20. -z $(echo $line |awk '{print $4}') \
  21. -l $location \
  22. --no-wait;
  23. done < mongodb
批量创建了15台虚机:
Azure + MongoDB - NoSQL数据库集群初探(实践篇)
用Ansible批量部署MongoDB应用
测试 Ansible 是否连通
 
   
   
 
  1. ansible -i hosts/mongodb mongodb -m ping
Azure + MongoDB - NoSQL数据库集群初探(实践篇)
下载MongoDB安装包并内网共享
 
   
   
 
  1. wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.4.17.tgz
  2. #启用Python自带的SimpleHTTPServer实现内网共享
  3. sudo python -m SimpleHTTPServer 80
  4. #保持当前命令行窗口打开,不要关闭


Ansible 脚本批量安装MongoDB
 
   
   
 
  1. #运行环境:JumpVM
  2. #新开个终端命令行ssh到jumpVM
  3. #进入MongoDB的Ansible部署脚本文件夹

  4. #nvme 磁盘创建 xfs 文件系统,并挂载目录/data1(MongoDB 节点的数据存放目录)
  5. ansible-playbook -i hosts/mongodb -b playbooks/mkfs-mount.yml


Azure + MongoDB - NoSQL数据库集群初探(实践篇)
跑完后,可以看到 /dev/sdb 变成了 xfs 格式并挂载了 /data1 。需要注意的是,如果服务器重启,该盘格式和数据会丢,需要重新跑遍 Ansible 脚本
Azure + MongoDB - NoSQL数据库集群初探(实践篇)
 
   
   
 
  1. #安装MongoDB基础环境
  2. ansible-playbook -i hosts/mongodb -b playbooks/install-mongodb-arch.yml

  3. #部署 configserver
  4. ansible-playbook -i hosts/mongodb -b playbooks/install-mongodb-configserver.yml
like this:
Azure + MongoDB - NoSQL数据库集群初探(实践篇)


 
   
   
 
  1. #部署 shard1~4 分片
  2. ansible-playbook -i hosts/mongodb -b playbooks/install-mongodb-shard.yml --extra-vars 'hosts=shard1'
  3. ansible-playbook -i hosts/mongodb -b playbooks/install-mongodb-shard.yml --extra-vars 'hosts=shard2'
  4. ansible-playbook -i hosts/mongodb -b playbooks/install-mongodb-shard.yml --extra-vars 'hosts=shard3'
  5. ansible-playbook -i hosts/mongodb -b playbooks/install-mongodb-shard.yml --extra-vars 'hosts=shard4'

  6. #启动configserver 并初始化副本集
  7. ansible-playbook -i hosts/mongodb -b playbooks/start-mongodb-configserver.yml
配置集群大脑 config server
 
   
   
 
  1. #跳板机登陆到预置主节点10.14.194.21 (mongos01)
  2. ssh azureuser@mongos01
  3. #进入mongo shell
  4. mongo 127.0.0.1:61101/admin

Azure + MongoDB - NoSQL数据库集群初探(实践篇)


 
   
   
 
  1. //配置服务器变量
  2. configserver = {
  3. _id : "configserver",
  4. members : [
  5. {_id : 0, host : "10.14.194.21:61101" , priority: 3 },
  6. {_id : 1, host : "10.14.194.22:61101" , priority: 2 },
  7. {_id : 2, host : "10.14.194.23:61101" , priority: 1 }
  8. ]
  9. }


Azure + MongoDB - NoSQL数据库集群初探(实践篇)


 
   
   
 
  1. //初始化配置服务器
  2. rs.initiate(configserver);
正常的话会返回 ok=1:
Azure + MongoDB - NoSQL数据库集群初探(实践篇)


 
   
   
 
  1. //切换 admin库
  2. use admin
  3. //创建用户:
  4. db.createUser(
  5. {
  6. user:"root",
  7. pwd:"proj2019",
  8. roles:["root"]
  9. }
  10. )
显示添加用户成功:
Azure + MongoDB - NoSQL数据库集群初探(实践篇)


 
   
   
 
  1. //退出mongo shell
  2. exit
  3. //断开跳板机到mongos01的ssh连接
  4. exit
配置sharding
 
   
   
 
  1. #在跳板机上进行操作
  2. #启动shard1并初始化
  3. ansible-playbook -i hosts/mongodb -b playbooks/start-mongodb-shard.yml --extra-vars 'hosts=shard1'

  4. #登录到当前分片预置主节点10.14.194.9 mongodb01
  5. ssh azureuser@mongodb01
  6. #进入mongo shell
  7. mongo 127.0.0.1:62001/admin

  8. //shard1配置
  9. shard1config = {
  10. _id : "shard1",
  11. members : [
  12. {_id : 0, host : "10.14.194.9:62001" , priority: 3 },
  13. {_id : 1, host : "10.14.194.10:62001" , priority: 2 },
  14. {_id : 2, host : "10.14.194.11:62001" , priority: 1 }
  15. ]
  16. }
  17. rs.initiate(shard1config);
  18. //切换 admin库
  19. use admin
  20. //创建用户:
  21. db.createUser(
  22. {
  23. user:"root",
  24. pwd:"proj2019",
  25. roles:["root"]
  26. }
  27. )
  28. #退出shell
  29. #退出跳板机到mongodb01的ssh的连接
然后依次ssh到剩下3个主节点(mongos04,07,10)启动shard2,3,4并初始化,步骤与shard1一致,注意更改ip。
配置并启动集群入口 mongos
 
   
   
 
  1. #启动mongos并初始化。启动后,mongos 服务监听端口 62201
  2. ansible-playbook -i hosts/mongodb -b playbooks/start-mongodb-mongos.yml
  3. #登陆到 mongos01 10.14.194.21 节点,通过 mongo shell 添加用户权限并增加分片,添加分片路由规则

ssh azureuser@mongos01


  1. mongo 127.0.0.1:62201/admin
  2. db.auth("root", "proj2019")
  3. sh.addShard("shard1/10.14.194.9:62001,10.14.194.10:62001,10.14.194.11:62001")
  4. sh.addShard("shard2/10.14.194.12:62002,10.14.194.13:62002,10.14.194.14:62002")
  5. sh.addShard("shard3/10.14.194.15:62003,10.14.194.16:62003,10.14.194.17:62003")
  6. sh.addShard("shard4/10.14.194.18:62004,10.14.194.19:62004,10.14.194.20:62004")


Azure + MongoDB - NoSQL数据库集群初探(实践篇)
最喜欢看到 ok=1
MongoDB集群部署完毕。
简单验证
先检查一下集群状态:
sh.status()
Azure + MongoDB - NoSQL数据库集群初探(实践篇)


连接到mongos,建立数据库以及集合,并且打开集合的分片功能
 
   
   
 
  1. mongo 127.0.0.1:62201/admin
  2. db.auth("root", "proj2019")

  3. #建立一个database, 名称是test
  4. use test

  5. #建立一个集合,名称是demo
  6. db.createCollection("demo")

  7. #把这个集合的sharding功能打开
  8. sh.enableSharding("demo")


Azure + MongoDB - NoSQL数据库集群初探(实践篇)

连接到 config server ,配置集合的分片方式
 
   
   
 
  1. mongo 127.0.0.1:61101/admin
  2. db.auth("root","proj2019")
  3. use config

  4. #查看目前database sharding的情况
  5. db.databases.find()
Azure + MongoDB - NoSQL数据库集群初探(实践篇)
这边注意到 test dbshard 还没打开,先不管它往下走
按照ID哈希的算法分片
 
   
   
 
  1. sh.shardCollection("test.demo",{"_id":"hashed"})
报错啦:
Azure + MongoDB - NoSQL数据库集群初探(实践篇)


因为 test 没有打开 sharding功能,正如上上图所示。
可以先尝试刷下下路由信息:
db.adminCommand("flushRouterConfig")
打开test的sharding功能,再用哈希算法分片:
 
   
   
 
  1. sh.enableSharding("test")
  2. sh.shardCollection("test.demo",{"_id":"hashed"})
Azure + MongoDB - NoSQL数据库集群初探(实践篇)
分片成功。
查看下状态:
Azure + MongoDB - NoSQL数据库集群初探(实践篇)
sh . status ()
Azure + MongoDB - NoSQL数据库集群初探(实践篇)

连接到Mongos,插入10w条数据
 
   
   
 
  1. mongo 127.0.0.1:62201/admin
  2. db.auth("root", "proj2019")
  3. use test

  4. #往集合demo里插入数据
  5. for(var i=1;i<=100000;i++){ db.demo.insert({"id":i,"myName":"demo"+i,"myDate":new Date()}); }


#可以在另外的console查询数据是否插入完成;若完成,count应该显示100000

  1. db.demo.count()


Azure + MongoDB - NoSQL数据库集群初探(实践篇) 成!
查看所有的分片是否都有数据插入,注意观察四个分片的counts,size等
db.demo.stats()
可以看到基本上数据分布的很平均,验证结束~


至此,MongoDB集群在Azure上创建完成,篇幅较长,能看到最后的都是壮士......其实只有自己动手操作后才发现会遇到很多坑,而debug的过程是痛并快乐着的(解决以后才会快乐)。然后wx的排版真让人崩溃QwQ


欢迎关注我的公众号,行云拨雾

参考资料

如何创建虚拟机或 VHD 的映像 https://docs.azure.cn/zh-cn/virtual-machines/linux/capture-image
MongoDB官网 https://www.mongodb.com


以上是关于Azure + MongoDB - NoSQL数据库集群初探(实践篇)的主要内容,如果未能解决你的问题,请参考以下文章

通过php的MongoDB driver连接Azure的DocumentDB PaaS

囤货:512M免费MongoDb云数据库,50万记录存储真香

教程Azure的NoSQL技术

Springboot连接NoSQL数据库MongoDB,读取集合数据文档

NOSQL《一》之MongoDB的理解

NoSQL:从表 DynamoDB/Azure 表存储中获取最新值