说明:用docker基于单服务器,虚拟多个服务器的方案,
一下配置是两个config服务器,两个分片,以及每个分片有一个副本的方案
1、安装docker
#前往阿里云,搜索<容器镜像服务>开启服务 #安装参考阿里云文档 https://yq.aliyun.com/articles/110806?spm=5176.8351553.0.0.320d19912gmHZ6 #开启镜像加速使用阿里云镜像服务器 #进入阿里云<容器镜像服务> -- <镜像中心> -- <镜像加速器> #按里面的步骤添加配置
2、安装docker-composer
#参考官方文档https://docs.docker.com/compose/install/ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose docker-compose --version
3、启动docker-compose文件
首先启动,这时还没有设置远程账号密码
docker-compose-no-auth.yml
version: '3' services: # config服务器一 config_one: container_name: config_one image: mongo:4.1.11 ports: - 27051:27019 volumes: - ./config_one/db:/data/db - ./config_one/configdb:/data/configdb command: --configsvr --replSet "rs_config" --bind_ip_all restart: always # config服务器二 config_two: container_name: config_two image: mongo:4.1.11 ports: - 27052:27019 volumes: - ./config_two/db:/data/db - ./config_two/configdb:/data/configdb command: --configsvr --replSet "rs_config" --bind_ip_all restart: always # 分片一的副本a shard_one_a: container_name: shard_one_a image: mongo:4.1.11 ports: - 27011:27018 volumes: - ./shard_one_a/db:/data/db - ./shard_one_a/configdb:/data/configdb - ./shard_one_a/backup:/data/backup command: --shardsvr --replSet "rs_shard_one_cluster" --bind_ip_all restart: always depends_on: - config_one - config_two # 分片二的副本a shard_two_a: container_name: shard_two_a image: mongo:4.1.11 ports: - 27012:27018 volumes: - ./shard_two_a/db:/data/db - ./shard_two_a/configdb:/data/configdb - ./shard_two_a/backup:/data/backup command: --shardsvr --replSet "rs_shard_two_cluster" --bind_ip_all restart: always depends_on: - config_one - config_two # 分片一的副本b shard_one_b: container_name: shard_one_b image: mongo:4.1.11 ports: - 27021:27018 volumes: - ./shard_one_b/db:/data/db - ./shard_one_b/configdb:/data/configdb - ./shard_one_b/backup:/data/backup command: --shardsvr --replSet "rs_shard_one_cluster" --bind_ip_all restart: always depends_on: - config_one - config_two # 分片二的副本b shard_two_b: container_name: shard_two_b image: mongo:4.1.11 ports: - 27022:27018 volumes: - ./shard_two_b/db:/data/db - ./shard_two_b/configdb:/data/configdb - ./shard_two_b/backup:/data/backup command: --shardsvr --replSet "rs_shard_two_cluster" --bind_ip_all restart: always depends_on: - config_one - config_two # mongos服务器一 mongos_one: container_name: mongos-one image: mongo:4.1.11 ports: - 27001:27017 volumes: - ./mongos_one/db:/data/db - ./mongos_one/configdb:/data/configdb entrypoint: mongos command: --configdb rs_config/192.168.10.188:27051,192.168.10.188:27052 --bind_ip_all depends_on: - shard_one_a - shard_two_a # mongos服务器二 mongos_two: container_name: mongos-two image: mongo:4.1.11 ports: - 27002:27017 volumes: - ./mongos_two/db:/data/db - ./mongos_two/configdb:/data/configdb entrypoint: mongos command: --configdb rs_config/192.168.10.188:27051,192.168.10.188:27052 --bind_ip_all depends_on: - shard_one_b - shard_two_b
4、配置分片,添加管理员
# 连接到任意一台配置服务器,初始化配置服副本 docker exec -it config_one /bin/bash mongo --host localhost --port 27019 rs.initiate({ _id: "rs_config", configsvr: true, members: [ { _id : 0, host : "172.19.60.174:27101" }, { _id : 1, host : "172.19.60.175:27101" } ] }); rs.status() # 连接到分片一,配置副本a、b docker exec -it shard_one_a /bin/bash mongo --host localhost --port 27018 rs.initiate({ _id: "rs_shard_one_cluster", members: [ { _id : 0, host : "172.19.60.174:27201" }, { _id : 1, host : "172.19.60.175:27201" } ] }); rs.status() # 连接到分片二,配置副本a、b docker exec -it shard_two_a /bin/bash mongo --host localhost --port 27018 rs.initiate({ _id: "rs_shard_two_cluster", members: [ { _id : 0, host : "172.19.60.174:27202" }, { _id : 1, host : "172.19.60.175:27202" } ] }); rs.status() # 连接到mongos服务器,添加分片 docker exec -it mongos-one /bin/bash mongo --host localhost --port 27017 sh.addShard("rs_shard_one_cluster/172.19.60.174:27201,172.19.60.175:27201"); sh.addShard("rs_shard_two_cluster/172.19.60.174:27202,172.19.60.175:27202"); sh.status() docker exec -it mongos-two /bin/bash mongo --host localhost --port 27017 sh.addShard("rs_shard_one_cluster/172.19.60.174:27201,172.19.60.175:27201"); sh.addShard("rs_shard_two_cluster/172.19.60.174:27202,172.19.60.175:27202"); sh.status() //为数据库启动分片 sh.enableSharding("test") //在需要分片的集合上对分片键建索引 //如果集合是空的,可以不创建索引直接进行下一步的分片会自动创建索引 //如果集合不为空,必须为分片建创建索引才行 db.test.ensureIndex({"id":1}) //设置分片键 //其中第一种是基于hash的分片,第二种为基于值的分片 sh.shardCollection( "test.student", { "id" : "hashed" } ) sh.shardCollection("test.teacher", { "id" : 1 } ) //查看片的状态 sh.status(); //查看片状态(完整版); printShardingStatus(db.getSisterDB("config"),1); //查看所有的分片服务器状态 db.stats(); //测试分片数据 use test for (var i = 1; i <= 1000; i++) { db.student.insert( { "id" : i , "name": "student" + i } ) } //分别连接到两个mongos, 分片一主副节点,分片二主副节点,查看是否数据都有 use test db.student.find().sort({id:1}); //生成管理员账号 docker exec -it mongos-one /bin/bash mongo --host localhost --port 27017 use admin db.runCommand({ "createUser" : "qmmg", "pwd" : "qimeng^mongo", "customData" : { }, "roles" : [ { "role" : "dbAdminAnyDatabase", "db" : "admin" }, { "role" : "readWriteAnyDatabase", "db" : "admin" }, { "role" : "root", "db" : "admin" } ] });
5、生成keyfile
//生成keyfile openssl rand -base64 756 > mongo-keyfile.jks chmod 400 mongo-keyfile.jks
5、配置密钥,使mongodb访问需要带密码
带keyfile的docker-compose-auth.yml
version: '3' services: # config服务器一 config_one: container_name: config_one image: mongo:4.1.11 ports: - 27051:27019 volumes: - ./config_one/db:/data/db - ./config_one/configdb:/data/configdb - ./mongo-keyfile.jks:/data/configdb/mongo-keyfile.jks command: --keyFile /data/configdb/mongo-keyfile.jks --configsvr --replSet "rs_config" --bind_ip_all restart: always # config服务器二 config_two: container_name: config_two image: mongo:4.1.11 ports: - 27052:27019 volumes: - ./config_two/db:/data/db - ./config_two/configdb:/data/configdb - ./mongo-keyfile.jks:/data/configdb/mongo-keyfile.jks command: --keyFile /data/configdb/mongo-keyfile.jks --configsvr --replSet "rs_config" --bind_ip_all restart: always # 分片一的副本a shard_one_a: container_name: shard_one_a image: mongo:4.1.11 ports: - 27011:27018 volumes: - ./shard_one_a/db:/data/db - ./shard_one_a/configdb:/data/configdb - ./shard_one_a/backup:/data/backup - ./mongo-keyfile.jks:/data/configdb/mongo-keyfile.jks command: --keyFile /data/configdb/mongo-keyfile.jks --shardsvr --replSet "rs_shard_one_cluster" --bind_ip_all restart: always depends_on: - config_one - config_two # 分片二的副本a shard_two_a: container_name: shard_two_a image: mongo:4.1.11 ports: - 27012:27018 volumes: - ./shard_two_a/db:/data/db - ./shard_two_a/configdb:/data/configdb - ./shard_two_a/backup:/data/backup - ./mongo-keyfile.jks:/data/configdb/mongo-keyfile.jks command: --keyFile /data/configdb/mongo-keyfile.jks --shardsvr --replSet "rs_shard_two_cluster" --bind_ip_all restart: always depends_on: - config_one - config_two # 分片一的副本b shard_one_b: container_name: shard_one_b image: mongo:4.1.11 ports: - 27021:27018 volumes: - ./shard_one_b/db:/data/db - ./shard_one_b/configdb:/data/configdb - ./shard_one_b/backup:/data/backup - ./mongo-keyfile.jks:/data/configdb/mongo-keyfile.jks command: --keyFile /data/configdb/mongo-keyfile.jks --shardsvr --replSet "rs_shard_one_cluster" --bind_ip_all restart: always depends_on: - config_one - config_two # 分片二的副本b shard_two_b: container_name: shard_two_b image: mongo:4.1.11 ports: - 27022:27018 volumes: - ./shard_two_b/db:/data/db - ./shard_two_b/configdb:/data/configdb - ./shard_two_b/backup:/data/backup - ./mongo-keyfile.jks:/data/configdb/mongo-keyfile.jks command: --shardsvr --replSet "rs_shard_two_cluster" --keyFile /data/configdb/mongo-keyfile.jks --bind_ip_all restart: always depends_on: - config_one - config_two # mongos服务器一 mongos_one: container_name: mongos-one image: mongo:4.1.11 ports: - 27001:27017 volumes: - ./mongos_one/db:/data/db - ./mongos_one/configdb:/data/configdb - ./mongo-keyfile.jks:/data/configdb/mongo-keyfile.jks entrypoint: mongos command: --keyFile /data/configdb/mongo-keyfile.jks --configdb rs_config/192.168.10.188:27051,192.168.10.188:27052 --bind_ip_all depends_on: - shard_one_a - shard_two_a # mongos服务器二 mongos_two: container_name: mongos-two image: mongo:4.1.11 ports: - 27002:27017 volumes: - ./mongos_two/db:/data/db - ./mongos_two/configdb:/data/configdb - ./mongo-keyfile.jks:/data/configdb/mongo-keyfile.jks entrypoint: mongos command: --keyFile /data/configdb/mongo-keyfile.jks --configdb rs_config/192.168.10.188:27051,192.168.10.188:27052 --bind_ip_all depends_on: - shard_one_b - shard_two_b
最后再次启动docker,这时候的mongodb访问就需要账号密码了
docker-compose -f docker-compose-auth.yml up -d