MongoDB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# 导入 GPG 密钥 sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4 # 创建列表文件 - 14.04 echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list # 创建列表文件 - 18.04 echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list # 创建列表文件 - 16.04 echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list # 清华大学镜像https://mirror.tuna.tsinghua.edu.cn/help/mongodb/ # 重载本地安装包数据库 sudo apt-get update # 安装最新版 sudo apt-get install -y mongodb-org # 安装指定版本 sudo apt-get install -y mongodb-org=4.0.10 mongodb-org-server=4.0.10 mongodb-org-shell=4.0.10 mongodb-org-mongos=4.0.10 mongodb-org-tools=4.0.10 # 启动 sudo service mongod start # 创建加密用户 mongo use admin # 创建管理员用户 role设置为 root 时拥有所有权限 db.createUser({ user: "admin", pwd: "adminpassword", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] }) db.system.users.remove({}) # 删除用户 use test db.createUser({user: "test", pwd: "123456", roles: [{ role: "dbOwner", db: "test" }]}) db.auth("test", "123456") # 使用用户登录 db.changeUserPassword('user','password'); # 修改密码 mongo test -u test -p # 删除除数据库 use test db.dropDatabase() # 编辑/etc/mongod.conf并重启 mongod服务密码登录生效 security: authorization: enabled bindIp: 0.0.0.0 允许外网连接: sudo ufw allow 27017 # 删除 Mongodb sudo service mongod stop sudo apt-get purge mongodb-org* sudo rm -r /var/log/mongodb sudo rm -r /var/lib/mongodb sudo rm /etc/apt/sources.list.d/mongodb*.list # Docker快速启动测试库 # docker run -itd --name mongo -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=mongo -p 27017:27017 mongo --auth docker run -itd --name mongo -p 27017:27017 mongo --auth docker exec -it mongo mongo admin |
数据备份和恢复
以下对本机操作时可不添加-h 参数,设置了用户名和密码时需添加-u 和-p 参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# 备份数据 mongodump -h <hostname><:port> -d dbname -o <path> # 恢复数据 mongorestore -h <hostname><:port> -d dbname <path> # 如果用户直接对所连接数据库进行授权则无需使用authenticationDatabase admin mongorestore -h <hostname><:port> -uadmin -pxxx --authenticationDatabase admin -d dbname <path> # 导出具体表 mongoexport -uxxx -pxxx -d dbname -o xxx.json -c tblname #导入具体表 mongoimport -uxxx -pxxx -d dbname -c tblname --file xxx.json # 删除指定表 use db_name db.collection_name.drop() db.collection_name.dropIndex( "xxx" ) db.collection_name.dropIndexes() # 分析查询缓慢原因 find({}).explain("executionStats") # 创建组合索引提升查询速度 db.comments.createIndex( { field1: 1, field2: 1, field3: 1 } ) |
开启慢查询日志
1 2 3 4 5 6 7 8 9 10 11 |
# Mongo Shell # db.setProfilingLevel(level,<slowms>) 0=off 1=slow 2=all db.setProfilingLevel(1,500); # 配置文件 profile = 1 slowms = 200 # yaml 格式配置文件 operationProfiling: slowOpThresholdMs: 200 mode: "slowOp" |
MongoDB本机数据迁移
在实际业务场景中,由于 MongoDB比较占用磁盘,原系统盘可能空间会逐渐显得不足以应付,此时就需要挂载新的磁盘,而将 MongoDB 的数据目录迁移到新磁盘上实际也非常简单,假设新磁盘挂载位置为/xxx:
1 2 3 4 5 6 |
systemctl stop mongodb mv /var/lib/mongodb /xxx/ # chown -R mongodb:mongodb /xxx/mongodb # 修改配置文件/etc/mongod.conf 中dbPath: /xxx/mongodb # 或ln -s /xxx/mongodb/ /var/lib/mongodb systemctl start mongodb |
常见问题
1、locale::facet::_S_create_c_locale name not valid
1 |
export LC_ALL="C" |
2、Failed to start mongod.service: Unit mongod.service not found.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# vi /etc/systemd/system/mongodb.service [Unit] Description=High-performance, schema-free document-oriented database After=network.target [Service] User=mongodb ExecStart=/usr/bin/mongod --quiet --config /etc/mongod.conf [Install] WantedBy=multi-user.target # 启动服务 sudo systemctl start mongodb sudo systemctl enable mongodb |
3、Failed: error connecting to db server: server returned error on SASL authentication step: Authentication failed.
传入-u -p 的同时传入
1 |
--authenticationDatabase admin |
4.file:WiredTiger.wt, WT_CURSOR.search: __wt_block_read_off, 286: WiredTiger.wt: potential hardware corruption…
网上常见的做法是使用mongod --repair --dbpath
,但如果在Docker中启动又怎么办呢,我的做法是再启一个容器并且挂载相应的磁盘空间,如我们使用/data/db1
进行挂载(当然也你可以对原容器的挂载地址进行调整),然后再执行
1 |
docker exec -it xxx mongod --repair --dbpath /data/db1 |
最后删除掉这个容器,启动原容器即可
5. Mongo db 4.0 GPG key expired
在/etc/apt/sources.list.d/mongodb-org-4.0.list文件相应位置添加trusted=yes
:
1 |
echo "deb [ arch=amd64,arm64 trusted=yes ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.0 multiverse" > /etc/apt/sources.list.d/mongodb-org-4.0.list |
curl -fsSL https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add –
Solr
下载JAVA:
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
1 2 3 4 5 6 7 8 9 |
sudo tar -zxvf jdk-8u211-linux-x64.tar.gz -C /opt/ #sudo vi /etc/profile export JAVA_HOME=/opt/jdk1.8.0_211/ export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH source /etc/profile |
下载 Solr:
http://apache.01link.hk/lucene/solr/7.7.2/solr-7.7.2.tgz
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
tar -zxf solr-7.7.2.tgz solr-7.7.2/bin/install_solr_service.sh --strip-components=2 sudo bash ./install_solr_service.sh solr-7.7.2.tgz # 创建 new_core 准备工作 sudo cp /opt/solr/server/solr/configsets/_default/conf/ -r /var/solr/data/new_core/ # 中文分词器 https://search.maven.org/remotecontent?filepath=com/github/magese/ik-analyzer-solr7/7.x/ik-analyzer-solr7-7.x.jar sudo cp ik-analyzer-solr7-7.x.jar /opt/solr/server/solr-webapp/webapp/WEB-INF/lib/ git clone https://github.com/magese/ik-analyzer-solr.git sudo cp -r ik-analyzer-solr/src/main/resources/* /opt/solr/server/solr-webapp/webapp/WEB-INF/classes/ # 按照GitHub编辑/var/solr/data/new_core/conf/managed-schema # 添加字段也使用managed-schema # 自定义关键词 /opt/solr/server/solr-webapp/webapp/WEB-INF/classes/ext.dic |
备份还原
注:所备份的目录应当存在并且 solr 用户具有可写权限
1 2 3 4 |
# 备份 http://localhost:8983/solr/your-collection-name/replication?command=backup&location=/tmp/solr/ # 还原,如名称不是 snapshot.时间戳的格式,还应指定 name参数 http://localhost:8983/solr/your-collection-name/replication?command=restore&location=/tmp/solr/ |
限制外网访问
1 2 3 4 5 6 7 8 9 10 11 12 13 |
sudo iptables -A INPUT -p tcp -s localhost --dport 8983 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 8983 -j DROP # 允许指定 IP 访问指定端口 sudo iptables -I INPUT -s 192.168.1.123 -p tcp --dport 8983 -j ACCEPT sudo iptables-save # 使用一条命令操作 iptables -I INPUT -s ! 192.168.1.123 -p TCP --dport 8983 -j DROP # 允许外网访问 iptables -A INPUT -p tcp --dport 8983 -j ACCEPT iptables -A OUTPUT -p tcp --sport 8983 -j ACCEPT sudo iptables -L INPUT --line-numbers # 显示已有规则 sudo iptables -D INPUT # 删除指定行规则 |
设置用户名、密码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# vi /opt/solr/server/etc/role.properties admin:123456,admin-role # vi /opt/solr/server/contexts/solr-jetty-context.xml <Get name="securityHandler"> <Set name="loginService"> <New class="org.eclipse.jetty.security.HashLoginService"> <Set name="name">请输入用户名和密码:</Set> <Set name="config"><SystemProperty name="jetty.home" default="."/>/etc/role.properties</Set> <!--上所编辑文件的相对路径--> </New> </Set> </Get> # vi /opt/solr/server/solr-webapp/webapp/WEB-INF/web.xml <security-constraint> ... <auth-constraint> <role-name>admin-role</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>BASIC</auth-method> <realm-name>请输入用户名和密码:</realm-name> </login-config> /etc/init.d/solr restart |
查询重复项
1 |
query?q=*:*&q.op=OR&indent=true&facet=true&facet.mincount=2&facet.field=id |
生产环境内存配置(/etc/default/solr.in.sh),如下例中设置为1G:
1 |
SOLR_JAVA_MEM="-Xms1g -Xmx1g" |
pysolr
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
pip install pysolr # 安装 # 主要操作代码 import pysolr try: solr = pysolr.Solr('http://用户名:密码@IP或域名/solr/your_collection/', timeout=100) except: print('Connection to Solr failed') # 添加 solr.add([ { "id": "doc_1", "name": "A test document", "food":"dsaklj" } ], commit=True) # 查询 results = solr.search('*:*') print (results.docs) # 删除 solr.delete(q='*:*', commit=True) |
常见问题
1、Error CREATEing SolrCore ‘new_core’: Couldn’t persist core properties…
查看/var/solr/data/new_core等相应目录权限,所有者应为 solr或拥有相关权限
2、Error CREATEing SolrCore ‘new_core’: Unable to create core [new_core] Caused by: Can’t find resource ‘solrconfig.xml’ in classpath or ‘/var/solr/data/new_core’
1 |
sudo cp /opt/solr/server/solr/configsets/_default/conf/ -r /var/solr/data/new_core/ |
RabbitMQ
相关文章:RabbitMQ消息中间件知识汇总
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# 安装 erlang sudo apt-get install erlang-nox -y # 获取密钥并添加 wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | sudo apt-key add - # wget -O - "https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc" | sudo apt-key add - sudo apt-get update sudo apt-get install rabbitmq-server -y sudo service rabbitmq-server status # 查看服务状态 sudo rabbitmqctl list_users # 查看用户 sudo rabbitmqctl add_user admin yourpassword # 添加普通用户 sudo rabbitmqctl set_user_tags admin administrator # 设置为管理员 # 安装插件启动可视化界面http://localhost:15672 sudo rabbitmq-plugins enable rabbitmq_management sudo service rabbitmq-server restart # 启动消息日志追踪,重启服务进行 admin > traces 进行添加 sudo rabbitmq-plugins <span class="kw3">enable</span> <em>rabbitmq</em>_<em>tracing</em> |
备份还原
首先可对 broker 定义文件进行导入和导出,在网页界面的首页下方,将导入的 json 文件在另一个服务中进行导入即可,其中包含用户、权限、exchange、queue等。
消息数据的备份和还原
1 2 3 4 5 6 7 8 |
# 查看数据存储目录 rabbitmqctl eval 'rabbit_mnesia:dir().' # 操作时最好能停止服务,假设输出结果为/var/lib/rabbitmq/mnesia/rabbit@xxxxxxxx # 对该目录进行打包 tar -zcvf rabbit@xxxxxxxx.tar.gz rabbit@xxxxxxxx # 上传到另一台RabbitMQ 服务器上解压并放到对应目录中 chown -R rabbitmq:rabbitmq rabbit@xxxxxxxx # 修改权限后启动服务 |
常见问题
1、RabbitMQ Not management user
1 |
rabbitmqctl set_user_tags 用户名 administrator |
2、RabbitMQ http access Denied:user ‘ guest ‘-user can only log on via localhost
1 2 3 |
# vi /etc/rabbitmq/rabbitmq.config [{rabbit, [{loopback_users, []}]}]. # 然后重启 rabbit 服务 |
3、启动失败直接使用rabbitmq-server,报错ERROR: epmd error for host xxx: timeout (timed out)
此时需要修改hostname 以例 Rabbit 可以识别,如
1 |
hostname localhost |
4、清空指定队列数据
1 |
rabbitmqctl purge_queue queue_name |